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

Flutter中使用ProxyProvider返回List<int>遇空列表问题求助

解决ProxyProvider返回空列表的问题

问题根源

你的代码问题出在异步操作与Provider同步执行的冲突:

  • retrieveNumberOfShipmentsByMixerId是异步方法,你在ProxyProvider的update里用.then()添加元素,但update是同步执行的——方法会立刻返回空的ints列表,此时所有异步请求还未完成;
  • 异步回调完成后给ints添加元素的动作,不会触发Provider的更新通知,因为普通List没有监听机制,UI无法感知后续的元素添加。

解决方案

要处理异步依赖,需要让ProxyProvider返回Future<List<int>>,再通过FutureProvider解析这个Future,最终提供可用的List<int>,全程无需使用FutureBuilder。

修改后的Provider配置

providers: [
  FutureProvider<List<Mixer>>(
    create: (_) => mixerdbService.retrieveMixers(),
    initialData: <Mixer>[],
  ),
  // 1. 基于List<Mixer>生成异步的Future<List<int>>
  ProxyProvider<List<Mixer>, Future<List<int>>>(
    update: (_, mixers, __) async {
      // 用Future.wait并行发起所有请求,效率远高于串行等待
      return await Future.wait(
        mixers.map((mixer) => shipmentdbService.retrieveNumberOfShipmentsByMixerId(mixer.id)),
      );
    },
  ),
  // 2. 解析Future,提供最终可直接使用的List<int>
  FutureProvider<List<int>>(
    create: (context) => context.read<Future<List<int>>>(),
    initialData: [],
  ),
],

在Widget中消费数据

直接通过watch获取最终的计数列表即可:

@override
Widget build(BuildContext context) {
  final shipmentCounts = context.watch<List<int>>();
  
  return ListView.builder(
    itemCount: shipmentCounts.length,
    itemBuilder: (_, index) => Text("搅拌器${index+1}的发货数:${shipmentCounts[index]}"),
  );
}

内容的提问来源于stack exchange,提问作者Tarik Waleed

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.22 13:06:18