Flutter应用生命周期恢复时无法从SharedPreferences获取数据
问题分析与解决方案
核心问题
你的代码存在两处关键语法错误,导致异步逻辑执行异常:
setPrefsData和getPrefsData方法缺少async修饰符,却在内部使用了await,这会让异步操作失去等待逻辑,无法保证存储/读取完成。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
相关产品推荐
相关产品推荐

