颤动可注射工厂未注册错误 [英] Flutter Injectable factory not registered error
本文介绍了颤动可注射工厂未注册错误的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
我在使用扑动注射包时遇到问题: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屋!
查看全文