From f2eb1fa265a3dbb0251a867b9376f4c814892f58 Mon Sep 17 00:00:00 2001 From: LingandRX Date: Sun, 11 May 2025 15:39:55 +0800 Subject: [PATCH] =?UTF-8?q?feat(category):=20=E6=B7=BB=E5=8A=A0=E5=88=86?= =?UTF-8?q?=E7=B1=BB=E5=8A=9F=E8=83=BD=E5=B9=B6=E6=9B=B4=E6=96=B0=E7=9B=B8?= =?UTF-8?q?=E5=85=B3=E9=A1=B5=E9=9D=A2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 新增 AddCategoryScreen 页面用于添加分类 - 更新 CategoryScreen 页面,添加浮动按钮用于导航到添加分类页面 - 修改 CategoryDropdown 组件,支持 ItemCategory 模型 - 更新 Item模型,将 location 改为字符串类型 - 修改 ItemScreen 页面,支持新的分类选择逻辑 - 更新数据库表结构,将 location 字段改为 TEXT 类型 --- lib/database/item_table.dart | 2 +- lib/models/item_model.dart | 8 +- .../category_screens/add_category_screen.dart | 73 +++++++++++++++++++ .../category_screens/category_screen.dart | 13 ++++ lib/screens/item_screens/item_screen.dart | 20 ++++- .../widgets/category_dropdown.dart | 15 ++-- 6 files changed, 116 insertions(+), 15 deletions(-) create mode 100644 lib/screens/category_screens/add_category_screen.dart diff --git a/lib/database/item_table.dart b/lib/database/item_table.dart index e967e98..d985fc9 100644 --- a/lib/database/item_table.dart +++ b/lib/database/item_table.dart @@ -3,7 +3,7 @@ CREATE TABLE items ( id INTEGER PRIMARY KEY AUTOINCREMENT, name TEXT NOT NULL, category_id INTEGER, - location_id INTEGER, + location TEXT, description TEXT, price REAL, purchase_date TEXT, diff --git a/lib/models/item_model.dart b/lib/models/item_model.dart index 30aaab0..a54a23f 100644 --- a/lib/models/item_model.dart +++ b/lib/models/item_model.dart @@ -7,7 +7,7 @@ class Item { // 分类 final int? categoryId; // 位置 - final int? locationId; + final String? location; // 描述 final String? description; // 价格 @@ -27,7 +27,7 @@ class Item { this.id, required this.name, this.categoryId, - this.locationId, + this.location, this.description, this.price, this.purchaseDate, @@ -41,7 +41,7 @@ class Item { return { 'name': name, 'category_id': categoryId, - 'location_id': locationId, + 'location': location, 'description': description, 'price': price, 'purchase_date': purchaseDate, @@ -57,7 +57,7 @@ class Item { id: map['id'], name: map['name'], categoryId: map['category_id'], - locationId: map['location_id'], + location: map['location'], description: map['description'], price: map['price'], purchaseDate: map['purchase_date'], diff --git a/lib/screens/category_screens/add_category_screen.dart b/lib/screens/category_screens/add_category_screen.dart new file mode 100644 index 0000000..0cb55d3 --- /dev/null +++ b/lib/screens/category_screens/add_category_screen.dart @@ -0,0 +1,73 @@ + +import 'package:flutter/material.dart'; +import 'package:item_tracker/provider/item_category_provider.dart'; +import 'package:item_tracker/screens/category_screens/category_screen.dart'; +import 'package:provider/provider.dart'; + +import '../../models/item_category_model.dart'; + +class AddCategoryScreen extends StatefulWidget { + @override + _AddCategoryScreenState createState() => _AddCategoryScreenState(); +} + +class _AddCategoryScreenState extends State { + final _formKey = GlobalKey(); + final _nameController = TextEditingController(); + final _descriptionController = TextEditingController(); + + @override + Widget build(BuildContext context) { + return Scaffold( + appBar: AppBar( + title: Text('添加分类'), + ), + body: Column( + children: [ + Form( + key: _formKey, + child: Column( + children: [ + TextFormField( + controller: _nameController, + decoration: InputDecoration(labelText: '名称'), + validator: (value) { + if (value == null || value.isEmpty) { + return '请输入名称'; + } + return null; + }, + ), + TextFormField( + controller: _descriptionController, + ), + ElevatedButton( + onPressed: () { + if (_formKey.currentState!.validate()) { + final category = ItemCategory( + name: _nameController.text, + description: _descriptionController.text + ); + + Provider.of(context, listen: false).addCategory(category); + + // 弹窗提示添加成功 + ScaffoldMessenger.of(context).showSnackBar(SnackBar( + content: Text('添加成功'), + duration: Duration(seconds: 1), + )); + + Navigator.pop(context); + Navigator.pop(context); + } + }, + child: Text('添加'), + ) + ] + ) + ) + ] + ), + ); + } +} \ No newline at end of file diff --git a/lib/screens/category_screens/category_screen.dart b/lib/screens/category_screens/category_screen.dart index d8d96ae..a7ef9a5 100644 --- a/lib/screens/category_screens/category_screen.dart +++ b/lib/screens/category_screens/category_screen.dart @@ -2,6 +2,7 @@ import 'package:flutter/material.dart'; import 'package:provider/provider.dart'; import '../../provider/item_category_provider.dart'; +import 'add_category_screen.dart'; import 'detail_category_screen.dart'; class CategoryScreen extends StatefulWidget { @@ -59,6 +60,18 @@ class _CategoryScreenState extends State { }).toList(), )); }), + floatingActionButton: FloatingActionButton( + onPressed: () async { + final shouldRefresh = await Navigator.push( + context, + MaterialPageRoute(builder: (context) => AddCategoryScreen()), + ); + }, + child: Icon( + Icons.add, + color: Colors.white, + ) + ) ); } } diff --git a/lib/screens/item_screens/item_screen.dart b/lib/screens/item_screens/item_screen.dart index c7f0542..241bdd8 100644 --- a/lib/screens/item_screens/item_screen.dart +++ b/lib/screens/item_screens/item_screen.dart @@ -1,4 +1,6 @@ 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'; @@ -56,12 +58,14 @@ class _FromTestRouteSate extends State { String _selected = ''; double? _price; DateTime? _selectedDate; - String? _selectedCategory; // 当前选中的分类 + int? _selectedCategory; // 当前选中的分类 ItemIsUse? _itemIsUse = ItemIsUse.yes; GlobalKey _formKey = GlobalKey(); + late ItemCategoryProvider _itemCategoryProvider; + // 添加自定义分类列表 - List _categories = ['A', 'B', 'C', 'D']; // 自定义分类 + late List _categories; // 自定义分类 @override void initState() { @@ -70,12 +74,22 @@ class _FromTestRouteSate extends State { if (item != null) { _name = item.name; _description = item.description!; + _location = (item.location == null ? '' : item.location)!; _selectedDate = item.purchaseDate; } + _itemCategoryProvider = Provider.of(context, listen: false); + Future.microtask(() { + _itemCategoryProvider = + Provider.of(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('新增物品'), @@ -130,7 +144,7 @@ class _FromTestRouteSate extends State { final newItem = Item( name: _name, description: _description, - purchaseDate: _selectedDate, + categoryId: _selectedCategory, isInUse: _itemIsUse, price: _price, ); diff --git a/lib/screens/item_screens/widgets/category_dropdown.dart b/lib/screens/item_screens/widgets/category_dropdown.dart index 9cd6a09..71621a5 100644 --- a/lib/screens/item_screens/widgets/category_dropdown.dart +++ b/lib/screens/item_screens/widgets/category_dropdown.dart @@ -1,9 +1,10 @@ import 'package:flutter/material.dart'; +import 'package:item_tracker/models/item_category_model.dart'; class CategoryDropdown extends StatelessWidget { - final List categories; - final String? selectedCategory; - final ValueChanged onChanged; + final List categories; + final int? selectedCategory; + final ValueChanged onChanged; CategoryDropdown({ required this.categories, @@ -13,12 +14,12 @@ class CategoryDropdown extends StatelessWidget { @override Widget build(BuildContext context) { - return DropdownButtonFormField( + return DropdownButtonFormField( value: selectedCategory, items: categories.map((category) { - return DropdownMenuItem( - value: category, - child: Text(category), + return DropdownMenuItem( + value: category.id, + child: Text(category.name), ); }).toList(), onChanged: onChanged,