Release/Profile模式无法运行Flutter Web项目 报'isAsync'空指针错误
Flutter Web Release/Profile模式get_it报错
isAsync空指针解决方案 该报错根因为Release/Profile模式下Dart2JS编译开启树摇优化,get_it注册的类型实例被错误移除,或依赖未完成初始化就被调用,导致get方法返回null后调用isAsync属性触发空指针,Debug模式未开启树摇优化因此运行正常,可按以下步骤排查修复:
- 修正所有get_it注册、调用语句的泛型声明,禁止使用无泛型的注册/调用写法:
错误写法示例:
正确写法示例:// 注册时未指定接口泛型 getIt.registerFactory(() => LoginRepoImpl()); // 调用时未指定泛型 final repo = getIt();// 注册时明确声明对应抽象类/接口泛型 getIt.registerFactory<LoginRepo>(() => LoginRepoImpl()); // 调用时明确指定泛型 final repo = getIt<LoginRepo>(); - 若配合injectable自动注入框架使用,先清除旧编译缓存重新生成注入代码,依次执行以下命令:
flutter clean flutter pub get dart run build_runner build --delete-conflicting-outputs - 检查异步依赖的初始化顺序:如果存在
registerSingletonAsync等异步注册的依赖,必须在应用启动前等待初始化完成,示例:void main() async { WidgetsFlutterBinding.ensureInitialized(); await configureDependencies(); // 你的注入初始化方法 // 也可单独等待指定依赖初始化完成 await getIt.isReady<DbService>(); runApp(const MyApp()); } - 若上述方案仍未解决,可给对应的实现类添加保留注解,防止编译时被树摇移除:
@pragma('vm:entry-point') @pragma('dart2js:keep') class LoginRepoImpl implements LoginRepo { // 类实现逻辑 }
内容的提问来源于stack exchange,提问作者Ruslan Pitula
相关产品推荐
相关产品推荐

