flutter-demo/lib/screens/item_screens/item_screen.dart
LingandRX f2eb1fa265 feat(category): 添加分类功能并更新相关页面
- 新增 AddCategoryScreen 页面用于添加分类
- 更新 CategoryScreen 页面,添加浮动按钮用于导航到添加分类页面
- 修改 CategoryDropdown 组件,支持 ItemCategory 模型
- 更新 Item模型,将 location 改为字符串类型
- 修改 ItemScreen 页面,支持新的分类选择逻辑
- 更新数据库表结构,将 location 字段改为 TEXT 类型
2025-05-11 15:39:55 +08:00

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)
],
),
);
}),
);
}
}