Flutter应用首次加载页面后Provider存储的状态变为空问题求助
问题排查与修复方案
1. 修正Provider注册方式
你当前使用ChangeNotifierProvider.value来注册MyLocation实例,这个构造函数仅适用于复用已经存在的ChangeNotifier场景,如果你是首次创建实例,应该用create构造,避免MyApp触发重建时生成新的MyLocation实例导致旧状态丢失,修改main.dart代码:
// 替换原有的ChangeNotifierProvider.value ChangeNotifierProvider( create: (context) => MyLocation(), ),
2. 修正异步调用的Provider listen参数
你在_setCurrentLocation方法的无本地缓存分支中,调用Provider时没有加listen: false,默认的listen:true会给当前HomeScreen绑定MyLocation的更新依赖,首次更新状态时会触发额外的重建逻辑,修改对应代码:
if (!prefs.containsKey('locationData')) { print("no location data"); // 增加listen: false参数 await Provider.of<MyLocation>(context, listen: false).setCurrentLocation(); }
3. 优化异步初始化逻辑
你当前在didChangeDependencies中直接调用异步方法,没有等待异步执行完成就修改了_isInit标记,同时未处理异步执行过程中组件销毁的情况,推荐调整初始化逻辑到initState中执行:
@override void initState() { super.initState(); controller = FloatingSearchBarController(); // 加mounted判断避免上下文失效 WidgetsBinding.instance.addPostFrameCallback((_) async { if (mounted) { await _setCurrentLocation(context); } }); } // 移除didChangeDependencies中的初始化相关逻辑即可
4. 可选:增加加载状态避免空值展示
如果需要避免初始化过程中出现空值提示,可以在MyLocation中增加一个加载状态字段,或者在HomeScreen中加一个加载中标记,初始化完成前展示加载动画,避免出现空值闪烁。
内容的提问来源于stack exchange,提问作者Arshad
相关产品推荐
相关产品推荐

