Flutter Injectable 工厂未注册错误
Flutter Injectable factory not registered error
我在使用 Flutter 可注入包时遇到问题: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;
}
这是我的main.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(
...
),
);
}
}
这是 injection.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 初始化不是同步函数,因为我的一个@modules 是异步的。具体来说,SharedPreferences 包,其构造函数是异步的 (Future<SharedPreferences> getInstance()
)。因此,如果您有一个异步模块,那么您需要等待 configureInjection()
函数
要解决此问题,您只需等待 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
returns Future
Future<void> configureInjection(String env)
如果您正在使用 Injectable package,您将需要使用 @preResolve 注释您的 @module 或 injectable,因此模块在 configureInjection
函数中等待。像这样:
@preResolve
Future<SharedPreferences> get sharedPreferences => SharedPreferences.getInstance();
我在使用 Flutter 可注入包时遇到问题: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;
}
这是我的main.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(
...
),
);
}
}
这是 injection.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 初始化不是同步函数,因为我的一个@modules 是异步的。具体来说,SharedPreferences 包,其构造函数是异步的 (Future<SharedPreferences> getInstance()
)。因此,如果您有一个异步模块,那么您需要等待 configureInjection()
函数
要解决此问题,您只需等待 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
returns Future
Future<void> configureInjection(String env)
如果您正在使用 Injectable package,您将需要使用 @preResolve 注释您的 @module 或 injectable,因此模块在 configureInjection
函数中等待。像这样:
@preResolve
Future<SharedPreferences> get sharedPreferences => SharedPreferences.getInstance();