如何解决具有共享首选项的 Flutter 依赖注入
晚上好, 我正在尝试将依赖注入与共享首选项插件一起使用,但是一旦我生成代码,我就会收到一个不相关的 Bloc 的错误。 我用
我的目标是将 SharedPreferences 注入到处理本地操作的类中,它看起来像这样:
class LocalSharedPreferences {
final SharedPreferences _preferences;
LocalSharedPreferences(this._preferences);
...
}
为了正确注入 SharedPreferences,我遵循了它的官方文档(https://pub.dev/packages/injectable#registering-asynchronous-injectables),因此我注入第 3 方模块的代码如下所示:
@module
abstract class RegisterModule {
@preResolve
Future<SharedPreferences> get prefs => SharedPreferences.getInstance();
}
我在 StackOverflow 上关注了 this 问题,但没有用。我的错误如下:
The following assertion was thrown building SignInForm(dependencies: [MediaQuery]):
Object/factory with type SignInFormBloc 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'
Future<GetIt> $initGetIt(
GetIt get,{
String environment,EnvironmentFilter environmentFilter,}) async {
final gh = GetItHelper(get,environment,environmentFilter);
final registerModule = _$RegisterModule();
gh.factory<DatosBauServerApiHelper>(() => DatosBauServerApiHelper());
gh.factory<DatosBauServerAuth>(
() => DatosBauServerAuth(get<DatosBauServerApiHelper>()));
gh.lazySingleton<IAuthFacade>(
() => DatosBauServerAuthFacade(get<DatosBauServerAuth>()));
final sharedPreferences = await registerModule.prefs;
gh.factory<SharedPreferences>(() => sharedPreferences);
gh.factory<SignInFormBloc>(() => SignInFormBloc(get<IAuthFacade>()));
return get;
}
class _$RegisterModule extends RegisterModule {}
解决方法
包裹Get it
LocalSharedPreferences 类
abstract class LocalSharedPreferences {
// ...
}
LocalSharedPreferencesImpl 类
class LocalSharedPreferencesImpl extends LocalSharedPreferences {
// ...
// Use your globalSharedPrefs variable here
}
另一个 dart 文件
GetIt locator = GetIt.instance;
setupServicesLocator() {
locator.registerLazySingleton<LocalSharedPreferences>(() => LocalSharedPreferencesImpl());
}
您的 main.dart 文件
SharedPreferences globalSharedPrefs;
void main() async {
/* ENSURE ASYNC WILL NOT GENERATE RUNTIME ERROR */
WidgetsFlutterBinding.ensureInitialized();
/* GLOBAL SERVICES */
setupServicesLocator();
/* Initialize your globalSharedPreferences variable here */
globalSharedPrefs = await SharedPreferences.getInstance();
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。