From 083b4e506afe1b73eb399b29e7e076613e4e20a1 Mon Sep 17 00:00:00 2001 From: LingandRX Date: Mon, 5 May 2025 22:12:09 +0800 Subject: [PATCH] =?UTF-8?q?feat(item):=20=E6=B7=BB=E5=8A=A0=E7=89=A9?= =?UTF-8?q?=E5=93=81=E5=88=A0=E9=99=A4=E5=8A=9F=E8=83=BD=E5=B9=B6=E4=BC=98?= =?UTF-8?q?=E5=8C=96=E7=89=A9=E5=93=81=E8=AF=A6=E6=83=85=E9=A1=B5=E9=9D=A2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 在 DetailItemScreen 中添加删除物品的按钮和确认对话框 - 在 ItemProvider 中实现删除物品的方法 - 在 ItemRepository 中实现删除物品的数据库操作 - 在 ItemModel 中添加 status 字段,用于标记物品状态 --- lib/database/item_table.dart | 1 + lib/models/item_model.dart | 7 +++ lib/provider/item_provider.dart | 10 +++ lib/repository/item_repository.dart | 30 ++++++++- lib/screens/item_screens/add_item_screen.dart | 1 + .../item_screens/detail_item_screen.dart | 63 ++++++++++++++++--- 6 files changed, 102 insertions(+), 10 deletions(-) diff --git a/lib/database/item_table.dart b/lib/database/item_table.dart index 96280be..ddadb7e 100644 --- a/lib/database/item_table.dart +++ b/lib/database/item_table.dart @@ -7,6 +7,7 @@ CREATE TABLE items ( description TEXT, purchase_date TEXT, is_in_use TEXT DEFAULT 'no', + status TEXT DEFAULT 'normal', created_at TEXT DEFAULT (datetime('now')), updated_at TEXT DEFAULT (datetime('now')) ); diff --git a/lib/models/item_model.dart b/lib/models/item_model.dart index bf1aee4..659ecfb 100644 --- a/lib/models/item_model.dart +++ b/lib/models/item_model.dart @@ -12,7 +12,11 @@ class Item { final DateTime? purchaseDate; // 是否使用 final String? isInUse; + // 数据状态 -normal -deleted + final String? status; + // 创建时间 final DateTime? createdAt; + // 更新时间 final DateTime? updatedAt; Item({ @@ -23,6 +27,7 @@ class Item { this.description, this.purchaseDate, this.isInUse = 'no', + this.status = 'normal', this.createdAt, this.updatedAt, }); @@ -35,6 +40,7 @@ class Item { 'description': description, 'purchase_date': purchaseDate, 'is_in_use': isInUse, + 'status': status, 'created_at': createdAt, 'updated_at': updatedAt, }; @@ -49,6 +55,7 @@ class Item { description: map['description'], purchaseDate: map['purchase_date'], isInUse: map['is_in_use'], + status: map['status'], createdAt: map['created_at'], updatedAt: map['updated_at'], ); diff --git a/lib/provider/item_provider.dart b/lib/provider/item_provider.dart index 4e957ff..e560ad6 100644 --- a/lib/provider/item_provider.dart +++ b/lib/provider/item_provider.dart @@ -21,4 +21,14 @@ class ItemProvider extends ChangeNotifier { await repository.insertItem(item); await loadItems(); // 插入后刷新 } + + Future updateItem(Item item) async { + await repository.updateItem(item); + await loadItems(); // 更新后刷新 + } + + Future deleteItem(Item item) async { + await repository.deleteItem(item); + await loadItems(); // 删除后刷新 + } } \ No newline at end of file diff --git a/lib/repository/item_repository.dart b/lib/repository/item_repository.dart index 8fbb626..789f352 100644 --- a/lib/repository/item_repository.dart +++ b/lib/repository/item_repository.dart @@ -7,13 +7,41 @@ class ItemRepository { ItemRepository({required this.dbHelper}); + /** + * 插入一条数据 + */ Future insertItem(Item item) async { final db = await dbHelper.database; return await db.insert('items', item.toMap()); } + /** + * 查询所有数据 + */ Future>> getAllItems() async { final db = await dbHelper.database; - return await db.query('items'); + return await db.query('items', where: 'status = ?', whereArgs: ['normal']); + } + + /** + * 更新数据 + */ + Future updateItem(Item item) async { + final db = await dbHelper.database; + return await db.update( + 'items', + item.toMap(), + where: 'id = ?', + whereArgs: [item.id], + ); + } + + /** + * 删除数据 + */ + Future deleteItem(Item item) async { + final db = await dbHelper.database; + return await db.update('items', {'status': 'delete'}, + where: 'id = ?', whereArgs: [item.id]); } } diff --git a/lib/screens/item_screens/add_item_screen.dart b/lib/screens/item_screens/add_item_screen.dart index 3cd2b2f..88f1dde 100644 --- a/lib/screens/item_screens/add_item_screen.dart +++ b/lib/screens/item_screens/add_item_screen.dart @@ -207,6 +207,7 @@ class _FromTestRouteSate extends State { Provider.of(context, listen: false) .addItem(newItem); + // 弹窗提示添加成功 ScaffoldMessenger.of(context).showSnackBar(SnackBar( content: Text('提交成功'), duration: Duration(seconds: 1), diff --git a/lib/screens/item_screens/detail_item_screen.dart b/lib/screens/item_screens/detail_item_screen.dart index 387df53..221b0e6 100644 --- a/lib/screens/item_screens/detail_item_screen.dart +++ b/lib/screens/item_screens/detail_item_screen.dart @@ -1,5 +1,9 @@ +import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; import 'package:item_tracker/models/item_model.dart'; +import 'package:provider/provider.dart'; + +import '../../provider/item_provider.dart'; class DetailItemScreen extends StatelessWidget { final Item item; @@ -13,15 +17,56 @@ class DetailItemScreen extends StatelessWidget { title: Text('${item.name}'), ), body: Padding( - padding: EdgeInsets.all(16.0), - child: Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ + padding: EdgeInsets.all(16.0), + child: + Column(crossAxisAlignment: CrossAxisAlignment.start, children: [ Text('名称: ${item.toMap().toString()}'), - Text('描述: ${item.description}') - ] - ) - ) + Text('描述: ${item.description}'), + ElevatedButton( + child: Padding( + padding: const EdgeInsets.all(16.0), + child: Text("删除"), + ), + onPressed: () { + showCupertinoDialog( + context: context, + builder: (context) { + return CupertinoAlertDialog( + title: Text('提示'), + content: Text('确定要删除吗?'), + actions: [ + CupertinoDialogAction( + child: Text('取消'), + onPressed: () { + Navigator.pop(context); + }, + ), + CupertinoDialogAction( + child: Text('确定'), + onPressed: () { + Provider.of(context, + listen: false) + .deleteItem(item); + + // 弹窗提示删除成功 + ScaffoldMessenger.of(context).showSnackBar(SnackBar( + content: Text('删除成功'), + duration: Duration(seconds: 1), + )); + Navigator.pop(context); + Navigator.pop(context); + }) + ]); + }); + }, + style: ElevatedButton.styleFrom( + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular(8.0), + ), + elevation: 4.0, + ), + ), + ])), ); } -} \ No newline at end of file +}