【问题标题】:Flutter dependency injenction with shared preferences具有共享偏好的 Flutter 依赖注入
【发布时间】:2021-04-01 15:16:55
【问题描述】:

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

  • 获取:^0.5.3,
  • injectable_generator: 1.0.6
  • flutter_bloc:^6.1.1.

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

class LocalSharedPreferences {
 final SharedPreferences _preferences;

 LocalSharedPreferences(this._preferences);
 ...
}

为了正确注入 SharedPreferences,我遵循了它的官方文档 (https://pub.dev/packages/injectable#registering-asynchronous-injectables),因此我注入 3rd-party 模块的代码如下所示:

@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 {}

【问题讨论】:

    标签: flutter dependency-injection sharedpreferences injectable


    【解决方案1】:

    Get it

    LocalSharedPreferences 类

    abstract class LocalSharedPreferences {
       // ...
    }
    

    LocalSharedPreferencesImpl 类

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

    【讨论】:

      猜你喜欢
      • 2019-03-20
      • 2021-10-11
      • 2014-12-31
      • 2019-03-18
      • 1970-01-01
      • 2023-01-25
      • 1970-01-01
      • 2017-09-27
      • 1970-01-01
      相关资源
      最近更新 更多