generated from dellevin/template
结构重构
This commit is contained in:
188
lib/pages/book/book_excerpt_form_page.dart
Normal file
188
lib/pages/book/book_excerpt_form_page.dart
Normal file
@@ -0,0 +1,188 @@
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:provider/provider.dart';
|
||||
import '../../providers/app_provider.dart';
|
||||
import '../../models/data_models.dart';
|
||||
import '../../utils/toast_util.dart';
|
||||
import 'package:uuid/uuid.dart';
|
||||
|
||||
/// 摘抄表单页面 - 新增/编辑摘抄
|
||||
class BookExcerptFormPage extends StatefulWidget {
|
||||
final String bookId;
|
||||
final BookExcerpt? excerpt;
|
||||
|
||||
const BookExcerptFormPage({
|
||||
super.key,
|
||||
required this.bookId,
|
||||
this.excerpt,
|
||||
});
|
||||
|
||||
@override
|
||||
State<BookExcerptFormPage> createState() => _BookExcerptFormPageState();
|
||||
}
|
||||
|
||||
class _BookExcerptFormPageState extends State<BookExcerptFormPage> {
|
||||
final _formKey = GlobalKey<FormState>();
|
||||
final _chapterController = TextEditingController();
|
||||
final _contentController = TextEditingController();
|
||||
final _commentController = TextEditingController();
|
||||
|
||||
bool _isLoading = false;
|
||||
|
||||
bool get _isEditing => widget.excerpt != null;
|
||||
|
||||
@override
|
||||
void initState() {
|
||||
super.initState();
|
||||
if (_isEditing) {
|
||||
_chapterController.text = widget.excerpt!.chapter;
|
||||
_contentController.text = widget.excerpt!.content;
|
||||
_commentController.text = widget.excerpt!.comment;
|
||||
}
|
||||
}
|
||||
|
||||
@override
|
||||
void dispose() {
|
||||
_chapterController.dispose();
|
||||
_contentController.dispose();
|
||||
_commentController.dispose();
|
||||
super.dispose();
|
||||
}
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
return Scaffold(
|
||||
backgroundColor: Colors.white,
|
||||
appBar: AppBar(
|
||||
title: Text(_isEditing ? '编辑摘抄' : '添加摘抄'),
|
||||
actions: [
|
||||
TextButton(
|
||||
onPressed: _isLoading ? null : _saveExcerpt,
|
||||
child: _isLoading
|
||||
? const SizedBox(
|
||||
width: 20,
|
||||
height: 20,
|
||||
child: CircularProgressIndicator(strokeWidth: 2),
|
||||
)
|
||||
: const Text(
|
||||
'保存',
|
||||
style: TextStyle(
|
||||
color: Color(0xFF1A1A1A),
|
||||
fontWeight: FontWeight.w600,
|
||||
),
|
||||
),
|
||||
),
|
||||
const SizedBox(width: 8),
|
||||
],
|
||||
),
|
||||
body: Form(
|
||||
key: _formKey,
|
||||
child: ListView(
|
||||
padding: const EdgeInsets.all(24),
|
||||
children: [
|
||||
// 章节
|
||||
TextFormField(
|
||||
controller: _chapterController,
|
||||
decoration: const InputDecoration(
|
||||
labelText: '章节(可选)',
|
||||
hintText: '例如:第一章、第3节等',
|
||||
border: OutlineInputBorder(
|
||||
borderRadius: BorderRadius.zero,
|
||||
),
|
||||
focusedBorder: OutlineInputBorder(
|
||||
borderRadius: BorderRadius.zero,
|
||||
borderSide: BorderSide(color: Color(0xFF1A1A1A)),
|
||||
),
|
||||
),
|
||||
),
|
||||
|
||||
const SizedBox(height: 24),
|
||||
|
||||
// 摘抄内容
|
||||
TextFormField(
|
||||
controller: _contentController,
|
||||
maxLines: 8,
|
||||
decoration: const InputDecoration(
|
||||
labelText: '摘抄内容',
|
||||
hintText: '输入你想要摘抄的内容...',
|
||||
alignLabelWithHint: true,
|
||||
border: OutlineInputBorder(
|
||||
borderRadius: BorderRadius.zero,
|
||||
),
|
||||
focusedBorder: OutlineInputBorder(
|
||||
borderRadius: BorderRadius.zero,
|
||||
borderSide: BorderSide(color: Color(0xFF1A1A1A)),
|
||||
),
|
||||
),
|
||||
validator: (value) {
|
||||
if (value == null || value.trim().isEmpty) {
|
||||
return '请输入摘抄内容';
|
||||
}
|
||||
return null;
|
||||
},
|
||||
),
|
||||
|
||||
const SizedBox(height: 24),
|
||||
|
||||
// 评论/感悟
|
||||
TextFormField(
|
||||
controller: _commentController,
|
||||
maxLines: 5,
|
||||
decoration: const InputDecoration(
|
||||
labelText: '我的感悟(可选)',
|
||||
hintText: '记录你对这段内容的思考和感悟...',
|
||||
alignLabelWithHint: true,
|
||||
border: OutlineInputBorder(
|
||||
borderRadius: BorderRadius.zero,
|
||||
),
|
||||
focusedBorder: OutlineInputBorder(
|
||||
borderRadius: BorderRadius.zero,
|
||||
borderSide: BorderSide(color: Color(0xFF1A1A1A)),
|
||||
),
|
||||
),
|
||||
),
|
||||
],
|
||||
),
|
||||
),
|
||||
);
|
||||
}
|
||||
|
||||
Future<void> _saveExcerpt() async {
|
||||
if (!_formKey.currentState!.validate()) return;
|
||||
|
||||
setState(() => _isLoading = true);
|
||||
|
||||
try {
|
||||
final now = DateTime.now();
|
||||
final excerpt = BookExcerpt(
|
||||
id: _isEditing ? widget.excerpt!.id : const Uuid().v4(),
|
||||
bookId: widget.bookId,
|
||||
chapter: _chapterController.text.trim(),
|
||||
content: _contentController.text.trim(),
|
||||
comment: _commentController.text.trim(),
|
||||
isDeleted: false,
|
||||
createdAt: _isEditing ? widget.excerpt!.createdAt : now,
|
||||
updatedAt: now,
|
||||
);
|
||||
|
||||
if (_isEditing) {
|
||||
await context.read<AppProvider>().updateBookExcerpt(excerpt);
|
||||
} else {
|
||||
await context.read<AppProvider>().addBookExcerpt(excerpt);
|
||||
}
|
||||
|
||||
if (mounted) {
|
||||
Navigator.pop(context);
|
||||
ToastUtil.show(context, _isEditing ? '摘抄已更新' : '摘抄已添加');
|
||||
}
|
||||
} catch (e) {
|
||||
if (mounted) {
|
||||
ToastUtil.show(context, '保存失败: $e');
|
||||
}
|
||||
} finally {
|
||||
if (mounted) {
|
||||
setState(() => _isLoading = false);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user