具有共享首选项的 Flutter 依赖注入

Flutter dependency injenction with shared preferences

晚上好, 我正在尝试将依赖注入与共享首选项插件一起使用,但是一旦我生成代码,我就会收到一个不相关的 Bloc 的错误。 我用

我的目标是将 SharedPreferences 注入 class 以处理本地操作,它看起来像这样:

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

我关注了 Whosebug 上的 问题,但没有成功。我的错误如下:

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 class

abstract class LocalSharedPreferences {
   // ...
}

LocalSharedPreferencesImpl class

class LocalSharedPreferencesImpl extends LocalSharedPreferences {
   // ...
   // Use your globalSharedPrefs variable here
}

另一个飞镖文件

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