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

Flutter应用生命周期恢复时无法从SharedPreferences获取数据

问题分析与解决方案

核心问题

你的代码存在两处关键语法错误,导致异步逻辑执行异常:

  1. setPrefsData 和 getPrefsData 方法缺少 async 修饰符,却在内部使用了 await,这会让异步操作失去等待逻辑,无法保证存储/读取完成。
  2. setPrefsData 中调用 prefs.setString 时未使用 await,无法确保数据完全写入本地就结束方法。

这会导致:首次启动应用时,存储操作可能还没完成就触发resumed状态的读取,因此拿到空值;而重启应用时,之前存储的数据已经持久化在本地,所以能正常读取。

修正后的代码

Home Controller 修正版

class HomeController extends GetxController {
  List<String> users = ['User 1', 'User 2'];
  SharedPreferences? _prefs; // 缓存实例,避免重复获取

  @override
  void onInit() {
    super.onInit();
    WidgetsBinding.instance.addPostFrameCallback((_) async {
      await _initPrefs();
      await setPrefsData();
    });
  }

  // 初始化SharedPreferences实例
  Future<void> _initPrefs() async {
    _prefs = await SharedPreferences.getInstance();
  }

  Future<void> setPrefsData() async {
    if (_prefs == null) await _initPrefs();
    await _prefs!.setString('allUsers', jsonEncode(users)); // await确保存储完成
  }

  Future<void> getPrefsData() async {
    if (_prefs == null) await _initPrefs();
    final stringifiedData = _prefs!.getString('allUsers');
    log('STRINGIFIED DATA::: ${stringifiedData}');
  }
}

生命周期监听代码(可直接沿用)

@override
void initState() {
  WidgetsBinding.instance.addObserver(this);
  super.initState();
}

@override
void dispose() {
  WidgetsBinding.instance.removeObserver(this);
  super.dispose();
}

@override
void didChangeAppLifecycleState(AppLifecycleState state) {
  super.didChangeAppLifecycleState(state);
  if (state == AppLifecycleState.resumed) {
    WidgetsBinding.instance.addPostFrameCallback((_) async { 
      await homeController.getPrefsData();
    });
  }
}

额外优化建议

  • 缓存SharedPreferences实例,避免每次调用方法重复获取,提升执行效率。
  • 在读写操作前检查实例是否初始化,保证操作的可靠性。
  • 如果需要resumed状态时获取最新数据,可以在数据更新时主动触发存储,再在resumed时读取。

内容的提问来源于stack exchange,提问作者Shoaib Akhtar

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.21 02:22:31