Flutter使用FutureProvider时initialData如何设置,数据不显示怎么办?
Flutter FutureProvider 数据不更新&加载状态异常解决方法
问题根因
你当前的设置存在两个核心问题:
- 用空数组
[]作为initialData时,无法区分「初始加载中还未拿到接口返回」和「接口确实返回了空列表」两种状态,如果你用「列表是否为空」作为加载判断条件,就会一直显示加载动画 - 注册和监听Provider的逻辑存在问题,导致接口返回数据后组件没有触发重绘
initialData 正确设置方式
如果需要明确区分加载状态,不要将initialData设为空数组,调整如下:
- 将FutureProvider的泛型改为可空类型:
FutureProvider<List<Datum>?> - initialData设为
null - 组件内的状态判断逻辑调整为:值为
null时显示加载动画,值不为null时再渲染列表(哪怕列表为空也可以显示空状态占位)
如果你不需要区分加载中与空列表,要保持initialData为[],则需要单独监听Future的加载状态,不能直接用列表是否为空判断是否加载中。
数据不显示的排查解决步骤
- 确认
FruitsProvider().getFruitsItem()的返回值类型严格为Future<List<Datum>>,如果返回Future<dynamic>会出现类型匹配失败,Provider无法识别到数据更新 - 不要在FutureProvider的create回调中直接实例化
FruitsProvider(),建议先在MultiProvider中提前注册FruitsProvider:
避免每次生成新的FruitsProvider实例,导致状态不一致MultiProvider( providers: [ ChangeNotifierProvider(create: (context) => FruitsProvider()), FutureProvider<List<Datum>?>( create: (context) => context.read<FruitsProvider>().getFruitsItem(), initialData: null, ) ] ) - 检查组件内获取Provider的方式是否开启了监听:需要在build方法内调用
Provider.of<List<Datum>?>(context),或者用Consumer<List<Datum>?>包裹列表组件,如果设置了listen: false组件不会随数据更新重绘 - 检查
getFruitsItem()方法是否正常执行:添加日志确认接口请求没有报错被静默捕获,Future没有进入error状态,请求成功后确实返回了List<Datum>类型的结果
内容的提问来源于stack exchange,提问作者Shaffaan Laughs at u
相关产品推荐
相关产品推荐

