Flutter返回页面FutureBuilder报myfuture未初始化错误求解
错误根因
抛出LateInitializationError: Field 'myfuture' has not been initialized的核心原因:
myfuture被声明为late final类型,语法要求该变量必须在被使用前完成赋值,但你的代码仅在FilterOptionProvider的initialList为空时才执行myfuture的赋值逻辑- 首次进入页面时
initialList无数据,判断条件成立,myfuture正常赋值,因此数据可以正常加载;当跳转其他页面后返回、或二次进入该页面时,Provider持有的initialList已经缓存了第一次加载的数据,isEmpty判断返回false,赋值逻辑被跳过,未初始化的myfuture被直接传入FutureBuilder,最终触发报错。
修复方案
- 补全全分支的赋值逻辑,确保
myfuture在initState执行完成前一定被赋值,不存在遗漏分支 - 当已有缓存数据时,给
myfuture赋值一个立即完成的同步Future即可,无需重复发起网络请求
修改后的initState代码如下:
late final Future myfuture; @override void initState() { print('init started'); final filterProvider = Provider.of<FilterOptionProvider>(context, listen: false); if (filterProvider.initialList.isEmpty) { myfuture = filterProvider.readfilters(checkfilters); } else { // 已有缓存时返回立即完成的Future,跳过加载态 myfuture = Future.value(); } super.initState(); }
优化提示:不要在
build方法内直接给FutureBuilder的future参数赋值,否则会导致每一次组件重绘都重复发起异步请求;如果需要在页面从其他页面返回时刷新数据,可以通过RouteAware监听路由返回事件,重新给myfuture赋值后调用setState触发刷新即可。
内容的提问来源于stack exchange,提问作者akm
相关产品推荐
相关产品推荐

