flutter-demo/lib/screens/item_screens/add_item_screen.dart
LingandRX faf439087a refactor(item): 重构添加物品页面
- 将 AddItemScreen 中的各个字段提取为独立的 Widget
- 新增 CategoryDropdown、DatePickerField、DescriptionField 等组件
- 优化 Item 模型,使用 ItemIsUse 枚举替代字符串表示是否使用
- 在数据库中添加 price 字段- 重构表单提交逻辑,使用新的组件进行数据采集
2025-05-06 22:06:19 +08:00

145 lines
4.6 KiB
Dart

import 'package:flutter/material.dart';
import 'package:item_tracker/screens/item_screens/widgets/category_dropdown.dart';
import 'package:item_tracker/screens/item_screens/widgets/date_picker_field.dart';
import 'package:item_tracker/screens/item_screens/widgets/description_field.dart';
import 'package:item_tracker/screens/item_screens/widgets/item_is_use_selector.dart';
import 'package:item_tracker/screens/item_screens/widgets/location_input_field.dart';
import 'package:item_tracker/screens/item_screens/widgets/name_input_field.dart';
import 'package:item_tracker/screens/item_screens/widgets/price_input_field.dart';
import 'package:item_tracker/screens/item_screens/widgets/submit_button.dart';
import 'package:provider/provider.dart';
import 'package:item_tracker/models/item_model.dart';
import 'package:item_tracker/provider/item_provider.dart';
DateTime? selectedDate;
enum ItemIsUse {
yes,
no,
}
extension ItemIsUseX on ItemIsUse {
int toInt() {
switch (this) {
case ItemIsUse.yes:
return 1;
case ItemIsUse.no:
return 0;
}
}
static ItemIsUse? fromInt(int? value) {
switch (value) {
case 1:
return ItemIsUse.yes;
case 0:
return ItemIsUse.no;
default:
return null;
}
}
}
class AddItemScreen extends StatefulWidget {
@override
_FromTestRouteSate createState() => _FromTestRouteSate();
}
class _FromTestRouteSate extends State<AddItemScreen> {
String _name = '';
String _description = '';
String _location = '';
String _selected = '';
double? _price;
DateTime? _selectedDate;
String? _selectedCategory; // 当前选中的分类
ItemIsUse? _itemIsUse = ItemIsUse.yes;
GlobalKey<FormState> _formKey = GlobalKey<FormState>();
// 添加自定义分类列表
List<String> _categories = ['A', 'B', 'C', 'D']; // 自定义分类
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text('新增物品'),
),
body: Builder(builder: (context) {
return Form(
key: _formKey,
autovalidateMode: AutovalidateMode.onUserInteraction,
child: ListView(
padding: EdgeInsets.symmetric(vertical: 8.0, horizontal: 16.0),
children: <Widget>[
NameInputField(initialValue: _name, onChanged: (v) => _name = v),
SizedBox(height: 16.0),
DescriptionField(onChanged: (v) => _description = v),
SizedBox(height: 16.0),
CategoryDropdown(
categories: _categories,
selectedCategory: _selectedCategory,
onChanged: (value) {
setState(() {
_selectedCategory = value;
});
},
),
SizedBox(height: 16.0),
LocationInputField(onChanged: (v) => _location = v),
SizedBox(height: 16.0),
DatePickerField(
selectedDate: _selectedDate,
onDateSelected: (date) => setState(() {
_selectedDate = date;
})),
SizedBox(height: 16.0),
ItemIsUseSelector(
selected: _itemIsUse,
onChanged: (v) => setState(() {
_itemIsUse = v;
})),
SizedBox(height: 16.0),
PriceInputField(
value: _price,
onChanged: (val) {
setState(() {
_price = val;
});
},
),
SizedBox(height: 28.0),
SubmitButton(onPressed: () {
if (_formKey.currentState!.validate()) {
final newItem = Item(
name: _name,
description: _description,
purchaseDate: _selectedDate,
isInUse: _itemIsUse,
price: _price,
);
print(newItem.toMap());
// 获取 ItemProvider 并添加物品
Provider.of<ItemProvider>(context, listen: false)
.addItem(newItem);
// 弹窗提示添加成功
ScaffoldMessenger.of(context).showSnackBar(SnackBar(
content: Text('提交成功'),
duration: Duration(seconds: 1),
));
// 确保只有在表单验证成功后才调用 Navigator.pop
Navigator.pop(context, true);
}
})
],
),
);
}),
);
}
}