You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.17 22:33:16