颤动可注射工厂未注册错误 [英] Flutter Injectable factory not registered error

查看:22
本文介绍了颤动可注射工厂未注册错误的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我在使用扑动注射包时遇到问题:https://pub.dev/packages/injectable

我收到一个错误,告诉我没有工厂注册,但我正在尝试注册

这是我试图获取的类,但如您所见,它使用@Ininable

注释

AUTH_BLOCLE.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;
}

这是我的干线。省道

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(
         ...
      ),
    );
  }
}

这是inpution.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()函数之前等待getIt初始化完成。于是它尝试获取尚未初始化的内容。

getIt初始化不是同步函数,因为我的一个@模块是异步的。具体地说,SharedPreferences包,该构造函数是异步的(Future<SharedPreferences> getInstance())。因此,如果您有一个异步模块,则需要等待configureInjection()函数

要解决此问题,您只需等待主机中的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注释@模块或可注入模块,因此该模块将在configureInjection函数中等待。如下所示:

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

这篇关于颤动可注射工厂未注册错误的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆