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
相关产品推荐
相关产品推荐

