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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.11 14:30:02