Flutter库存管理问题:新增Item后列表与本地文件无更新
库存应用Flutter+Riverpod写入本地文件与列表更新问题
我正在开发库存应用学习Flutter,目前已实现通过Riverpod从JSON资源文件读取物品列表,该功能正常。但因为Flutter无法写入资源文件,我编写了insertItem()方法,意图写入本地文件并将新物品添加到Riverpod管理的当前物品列表,但两者都没生效——没有报错,仅能看到“Item Added”提示栏,库存列表无变化,本地设备文件管理器里也找不到目标文件。
相关代码片段
Riverpod服务类
@riverpod class JsonInventoryService extends _$JsonInventoryService { late Future<List<Item>> _currentItems; late InventoryResult inventoryResult; @override Future<List<Item>> build() { return Future.value([Item(id: 0, productName: 'NULL ITEM'),]); } Future loadItems() async { var jsonString = await rootBundle.loadString('assets/inventorylist.json'); inventoryResult = InventoryResult.fromJson(jsonDecode(jsonString)); _currentItems = Future.value(inventoryResultsToItems(inventoryResult)); } Future<List<Item>> fetchData() async { return _currentItems; }
插入物品方法
Map<String, dynamic> insertItem(Item item) { inventoryResult.results.add(item); final jsonmap = inventoryResult.toJson(); //json_serializable自动处理嵌套类 storage.writeFile(jsonmap); return jsonmap; } }
注:Inventory Result是由json_serializable管理的模型类,包含物品属性及toJson、fromJson方法。
Storage工具类
class Storage { Future<String> get _localPath async { final directory = await getApplicationDocumentsDirectory(); return directory.path; } Future<File> get _localFile async { final path = await _localPath; return File('$path/inventorylist.json'); } Future<File> writeFile(dynamic jsonmap) async { final file = await _localFile; return file.writeAsString('$jsonmap'); } }
添加物品按钮组件
class AddItemButton extends ConsumerStatefulWidget { const AddItemButton({ required this.image, required this.mode, required this.storage, super.key, }); final Storage storage; @override ConsumerState createState() => _AddItemButtonState(); } class _AddItemButtonState extends ConsumerState<AddItemButton> { late var inventoryService = ref.watch(serviceProvider); late var currentItemList = inventoryService.fetchData(); @override Widget build(BuildContext context) { Item addNewItem({int? barcodeNo, required String productName}) { int id = Random().nextInt(100); Item newItem = Item(id: id, productName: productName, barcodeNo: barcodeNo, isActive: true,); inventoryService.insertItem(newItem); print("Added $productName!"); return newItem; }
注:Storage对象在main.dart中创建并传递给相关页面和类,添加物品按钮调用
insertItem()函数,库存列表页面调用fetchData()函数。
问题解决过程
编辑1
我已按建议修改代码,让Riverpod服务提供者的build()方法返回currentItems列表,但应用中无法使用该列表,多处出现AsyncValue<List<Item>>无法赋值给List或Future类型的错误。
编辑2
我使用AsyncBuilder结合when()表达式访问列表后,所有功能正常运行,特此记录供Riverpod初学者参考。
内容的提问来源于stack exchange,提问作者Stooges4
相关产品推荐
相关产品推荐

