- 新增 AddCategoryScreen 页面用于添加分类 - 更新 CategoryScreen 页面,添加浮动按钮用于导航到添加分类页面 - 修改 CategoryDropdown 组件,支持 ItemCategory 模型 - 更新 Item模型,将 location 改为字符串类型 - 修改 ItemScreen 页面,支持新的分类选择逻辑 - 更新数据库表结构,将 location 字段改为 TEXT 类型
176 lines
5.7 KiB
Dart
176 lines
5.7 KiB
Dart
import 'package:flutter/material.dart';
|
|
import 'package:item_tracker/models/item_category_model.dart';
|
|
import 'package:item_tracker/provider/item_category_provider.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 ItemScreen extends StatefulWidget {
|
|
final Item? itemToEdit;
|
|
|
|
const ItemScreen({Key? key, this.itemToEdit}) : super(key: key);
|
|
|
|
@override
|
|
_FromTestRouteSate createState() => _FromTestRouteSate();
|
|
}
|
|
|
|
class _FromTestRouteSate extends State<ItemScreen> {
|
|
String _name = '';
|
|
String _description = '';
|
|
String _location = '';
|
|
String _selected = '';
|
|
double? _price;
|
|
DateTime? _selectedDate;
|
|
int? _selectedCategory; // 当前选中的分类
|
|
ItemIsUse? _itemIsUse = ItemIsUse.yes;
|
|
GlobalKey<FormState> _formKey = GlobalKey<FormState>();
|
|
|
|
late ItemCategoryProvider _itemCategoryProvider;
|
|
|
|
// 添加自定义分类列表
|
|
late List<ItemCategory> _categories; // 自定义分类
|
|
|
|
@override
|
|
void initState() {
|
|
super.initState();
|
|
final item = widget.itemToEdit;
|
|
if (item != null) {
|
|
_name = item.name;
|
|
_description = item.description!;
|
|
_location = (item.location == null ? '' : item.location)!;
|
|
_selectedDate = item.purchaseDate;
|
|
}
|
|
_itemCategoryProvider = Provider.of<ItemCategoryProvider>(context, listen: false);
|
|
Future.microtask(() {
|
|
_itemCategoryProvider =
|
|
Provider.of<ItemCategoryProvider>(context, listen: false);
|
|
_itemCategoryProvider.loadCategories();
|
|
});
|
|
}
|
|
|
|
@override
|
|
Widget build(BuildContext context) {
|
|
final _c = _itemCategoryProvider.categories;
|
|
_categories = _c.toList();
|
|
print(_categories);
|
|
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,
|
|
categoryId: _selectedCategory,
|
|
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);
|
|
}
|
|
},
|
|
isEdit: widget.itemToEdit != null)
|
|
],
|
|
),
|
|
);
|
|
}),
|
|
);
|
|
}
|
|
}
|