繁体   English   中英

Flutter 可注射工厂未注册错误

[英]Flutter Injectable factory not registered error

我在为 Flutter 使用 Injectable package 时遇到问题: https://pub.dev/packages/injectable

我收到一条错误消息,告诉我我没有注册工厂,但我正在尝试获取它

这是我想要得到的 class 但你可以看到它用@injectable注释

auth_bloc.dart

import 'package:freezed_annotation/freezed_annotation.dart';

@injectable
class AuthBloc extends Bloc<AuthEvent, AuthState> {

}

同样在injection.config.dart中,您可以清楚地看到 AuthBloc 有它的工厂定义

Future<GetIt> $initGetIt(
  GetIt get, {
  String environment,
  EnvironmentFilter environmentFilter,
}) async {
  final gh = GetItHelper(get, environment, environmentFilter);

  ...

  gh.factory<AuthBloc>(() => AuthBloc(get<IAuthRepository>()));

  ...

  return get;
}

这是我的主要。dart

Future<void> main() async {
  WidgetsFlutterBinding.ensureInitialized();
  await Firebase.initializeApp();
  configureInjection(Environment.dev);
  runApp(MyApp());
}

这是我想要得到它的地方

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MultiBlocProvider(
      providers: [
        BlocProvider<AuthBloc>(
          create: (context) {
            return getIt<AuthBloc>() // <============ HERE
              ..add(
                const AuthEvent.authCheckRequested(), 
              );
          },
        ),
      ],
      child: MaterialApp(
         ...
      ),
    );
  }
}

这是注入.dart文件

import 'package:get_it/get_it.dart';
import 'package:injectable/injectable.dart';
import 'package:sales_app/injection.config.dart';

final GetIt getIt = GetIt.instance;

@injectableInit
void configureInjection(String env) {
  $initGetIt(getIt, environment: env);
}

这是我收到的错误消息

Object/factory with  type AuthBloc is not registered inside GetIt. 
(Did you accidentally do  GetIt sl=GetIt.instance(); instead of GetIt sl=GetIt.instance;
Did you forget to register it?)
'package:get_it/get_it_impl.dart':
Failed assertion: line 298 pos 9: 'instanceFactory != null'

这些是我的 pubspeck.yaml 依赖项

...
dependencies:
  injectable: ^1.0.5
...
dev_dependencies:
  injectable_generator: ^1.0.6
...

我终于解决了我的问题。 问题是在调用 getIt() function 之前,我没有等待 getIt 初始化完成。 所以它试图得到一些尚未初始化的东西。

getIt 初始化不是同步的 function 因为我的@modules 之一是异步的。 具体来说, SharedPreferences package,其构造函数是异步的( Future<SharedPreferences> getInstance() )。 因此,如果您有一个异步模块,那么您需要等待configureInjection() function

要解决这个问题,你只需要等待 main.dart 中的 getIt 初始化

我不得不更改我的 main.dart 代码:

Future<void> main() async {
  WidgetsFlutterBinding.ensureInitialized();
  await Firebase.initializeApp();
  // From this
  // configureInjection(Environment.dev);
  // to this:
  await configureInjection(Environment.dev);
  runApp(MyApp());
}

确保您的configureInjection返回Future Future<void> configureInjection(String env)

如果您使用的是Injectable package ,则需要使用 @preResolve 注释您的 @module 或可注入,因此该模块在configureInjection function 中等待。 像这样:

@preResolve
Future<SharedPreferences> get sharedPreferences => SharedPreferences.getInstance();

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM