如何解决Flutter开发中Shared Preferences无法正常生效的问题
问题原因
你遇到的无响应问题核心由以下几个原因导致:
- 空值强制解包崩溃:你在读取SharedPreferences数据时直接使用
!强制解包可空类型,如果对应key的值还没写入、或者缓存被清空,读取时会直接抛出空异常,导致页面无响应甚至闪退 - 异步时序问题:首页
initState中调用的setData()是异步方法,不会等待执行完成就会继续渲染页面,如果你打开应用立刻点击跳转按钮进入第二个页面,此时数据还没写入完成,读取就会拿到空值触发崩溃 - 导入冗余冲突:首页代码中同时导入了绝对路径和相对路径的
another_screen.dart,部分编译环境下会出现资源识别异常
修复方案
1. 清理冗余导入
删除首页中重复的导入语句,只保留其中一个即可:
// 删除其中一行导入 import 'package:flutter_application_2/another_screen.dart'; import 'another_screen.dart';
2. 替换强制解包为安全取值
修改第二个页面的getData()方法,给所有可空类型设置默认值,避免空异常:
getData() async { try { SharedPreferences _pref = await SharedPreferences.getInstance(); setState(() { _name = _pref.getString('name') ?? ''; _age = _pref.getInt('age'); _university = _pref.getString('university') ?? ''; _height = _pref.getInt('height'); _skills = _pref.getStringList('skills') ?? ['', '']; }); } catch (e) { // 开发阶段可以打印错误日志排查问题 debugPrint('读取SharedPreferences出错: $e'); } }
3. 优化异步时序(可选,避免首次启动读取失败)
如果需要保证进入应用时数据已经写入完成,可以将SharedPreferences初始化和数据写入提前到main函数中:
void main() async { // 确保Flutter引擎初始化完成 WidgetsFlutterBinding.ensureInitialized(); // 提前初始化并写入固定数据 final pref = await SharedPreferences.getInstance(); pref.setString('name', 'Rady'); pref.setInt('age', 19); pref.setString('university', 'Rady'); pref.setInt('height', 19); pref.setStringList('skills', ['Dart', 'Flutter']); runApp(const MyApp()); }
修改后可以删除首页initState中调用的setData()方法以及对应的方法实现,避免重复写入。
内容的提问来源于stack exchange,提问作者Rady Haggag
相关产品推荐
相关产品推荐

