升级Flutter到2.15后遇Non-nullable字段未初始化错误,如何修复?
错误原因
Flutter 2.12及以上版本默认启用空安全特性,你的代码中_instance和sharedPreferences被声明为非空类型但未初始化,违反了空安全规则;同时你使用的shared_preferences: ^0.5.7+3是不支持空安全的旧版本,这两个因素共同导致了报错。
修复步骤
1. 升级shared_preferences依赖
在pubspec.yaml中将依赖替换为支持空安全的稳定版本:
dependencies: shared_preferences: ^2.2.2 # 或更高兼容空安全的版本
执行flutter pub get完成依赖更新。
2. 修改工具类代码
以下两种方案任选其一即可:
方案一:使用可空类型+空合并运算符
import 'package:shared_preferences/shared_preferences.dart'; class SharedPreferencesUtil { SharedPreferencesUtil._(); static SharedPreferencesUtil? _instance; SharedPreferences? sharedPreferences; static SharedPreferencesUtil getInstance() { // 空合并运算符:仅当_instance为空时初始化 _instance ??= SharedPreferencesUtil._(); // 断言非空:此时_instance已确保完成初始化 return _instance!; } // 异步初始化SharedPreferences实例 Future<void> init() async { sharedPreferences ??= await SharedPreferences.getInstance(); } }
方案二:使用late延迟初始化
import 'package:shared_preferences/shared_preferences.dart'; class SharedPreferencesUtil { SharedPreferencesUtil._(); static late SharedPreferencesUtil _instance; late SharedPreferences sharedPreferences; static SharedPreferencesUtil getInstance() { try { return _instance; } catch (_) { _instance = SharedPreferencesUtil._(); return _instance; } } // 异步初始化SharedPreferences实例 Future<void> init() async { sharedPreferences = await SharedPreferences.getInstance(); } }
3. 使用前完成初始化
在main函数中先初始化工具类,确保sharedPreferences实例加载完成:
import 'package:flutter/material.dart'; void main() async { // 必须调用此方法确保Flutter绑定初始化完成 WidgetsFlutterBinding.ensureInitialized(); // 初始化SharedPreferences工具类 await SharedPreferencesUtil.getInstance().init(); runApp(const MyApp()); }
内容的提问来源于stack exchange,提问作者James2020
相关产品推荐
相关产品推荐

