Flutter使用shared_preferences出现非空变量未初始化错误如何解决?
问题原因
Error: The non-nullable variable 'localStorage' must be initialized.
这个报错是Dart空安全机制导致的:你声明的全局变量SharedPreferences localStorage属于非空类型,代码中没有给它设置初始值,也没有标记为延迟初始化或可空类型,编译器就会抛出这个错误。
解决方案
提供三种可行方案,按需选择即可:
- 方案1:标记变量为可空类型(最适配你现有代码逻辑)
直接把全局变量的声明修改为:
你现有代码里已经写了SharedPreferences? localStorage;if (localStorage != null)的判空逻辑,Dart空安全会自动对判空后的变量做类型提升,仅需要在取值的位置加!确认非空即可,示例如下:"User Logged in!!! -> Email Id: ${localStorage!.get('email')} Password: ${localStorage!.get('password')}" - 方案2:用late关键字标记延迟初始化
如果你确定变量在被使用前一定会被赋值,可以把声明改为:
这个方案不需要修改后续调用逻辑,但要注意如果未初始化就访问变量,会抛出运行时异常。late SharedPreferences localStorage; - 方案3:启动时提前初始化(最优方案,避免运行时风险)
直接在应用启动阶段就完成SharedPreferences的初始化,不用等到点击登录按钮再初始化,修改两处代码即可:- 保留非空类型,加late标记:
late SharedPreferences localStorage;- 修改main函数为异步,启动时完成初始化:
这个方案可以删掉MyApp里的init静态方法,也不用在save方法里调用init,所有位置都可以直接使用localStorage变量,不需要判空。void main() async { WidgetsFlutterBinding.ensureInitialized(); localStorage = await SharedPreferences.getInstance(); runApp(MyApp()); }
内容的提问来源于stack exchange,提问作者devfoz
相关产品推荐
相关产品推荐

