Flutter 2.2.2使用injectable调用SharedPreferences出现空检查错误
问题根因
错误栈指向MethodChannel.binaryMessenger为空触发非空断言异常,本质是你在Flutter框架完成底层初始化之前,就调用了依赖原生Platform Channel的SharedPreferences.getInstance()方法,配合injectable的@preResolve注解提前解析异步依赖时,也没有对齐初始化时序。
可行解决方案
第一步:对齐main函数初始化顺序
修改main.dart,在执行任何依赖原生通道的操作前,优先初始化Flutter框架绑定,示例代码如下:
void main() async { // 必须放在所有异步操作前,完成Flutter底层绑定初始化 WidgetsFlutterBinding.ensureInitialized(); // 再执行injectable的依赖注入初始化 await configureDependencies(); // 替换为你的injectable初始化方法名 runApp(const MyApp()); }
第二步:匹配依赖版本
你使用的是Flutter 2.2.2稳定版,需使用适配2.x版本的shared_preferences,推荐锁定版本为shared_preferences: ^2.0.15,避免高版本依赖不兼容导致的通道初始化异常。
第三步:清理缓存重新生成配置
执行以下命令清理旧的构建缓存,重新生成injectable代码:
flutter pub run build_runner clean flutter pub run build_runner build --delete-conflicting-outputs
兜底兼容方案
如果上述操作后仍有异常,可以取消@preResolve注解,改为懒加载获取SharedPreferences,规避启动阶段的初始化时序问题:
@module abstract class ThemeModule { Future<SharedPreferences> get prefs async => await SharedPreferences.getInstance(); }
使用时通过getIt.getAsync<SharedPreferences>()异步获取实例即可。
内容的提问来源于stack exchange,提问作者user8819119
相关产品推荐
相关产品推荐

