【问题标题】:how to solve getit shared preferences error?如何解决 getit 共享首选项错误?
【发布时间】:2022-07-04 15:00:23
【问题描述】:

我正在尝试对我的项目进行 bloctesting 并收到以下错误:

'package:get_it/get_it_impl.dart': Failed assertion: line 372 pos 7: 'instanceFactory != null': Object/factory with  type SharedPreferences 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?)

以下是我的 sharedpreferences 注入文件

shared_preference_injection_configuration.dart

import 'package:get_it/get_it.dart';
import 'package:injectable/injectable.dart';
import 'package:mynovatium/app/helper/injections/shared_preference/shared_preference_injection_configuration.config.dart';
import 'package:shared_preferences/shared_preferences.dart';

final GetIt getIt = GetIt.instance;

@injectableInit
Future<void> configureInjection(String env) async {
  await $initGetIt(getIt, environment: env);
}


Future<void> initDependencies() async {
  await _initSharedPref();
}

Future<void> _initSharedPref() async {
  final SharedPreferences sharedPref = await SharedPreferences.getInstance();
  getIt.registerSingleton<SharedPreferences>(sharedPref);
}

shared_preference_injection.dart

import 'package:injectable/injectable.dart';
import 'package:shared_preferences/shared_preferences.dart';

@module
abstract class InjectionModule {
//injecting third party libraries
  @preResolve
  Future<SharedPreferences> get prefs => SharedPreferences.getInstance();
}

下面是 main 方法。它已经有 configureinjection 和 initdependencies 方法但仍然给我同样的错误。

ma​​in.dart

void main() async {
  // Make sure all bindings are loaded for easy localization
  WidgetsFlutterBinding.ensureInitialized();
  await EasyLocalization.ensureInitialized();

  await configureInjection(Environment.prod);
  await initDependencies();

  // ignore: always_specify_types
  EasyLocalization.logger.enableBuildModes = [];

  // Load bloc Observer for debugging
  BlocOverrides.runZoned(() => SimpleBlocObserver());

  // Define main breakpoints for responsive_builder
  ResponsiveSizingConfig.instance.setCustomBreakpoints(
    const ScreenBreakpoints(desktop: PDesktopSize, tablet: PTabletSize, watch: PWatchSize),
  );

  // Set default locale to german style
  // Intl.defaultLocale = 'de_DE';

  // Load bloc Observer for debugging
  runZonedGuarded(
    () async {
      await BlocOverrides.runZoned(
        // Main Entry Point for our application
        // Translations wrapping around the whole app and start the structure for Cecht
        () async => runApp(
          EasyLocalization(
            supportedLocales: const <Locale>[
              Locale('en'),
              Locale('de'),
            ],
            path: 'assets/translations_v5',
            fallbackLocale: const Locale('de'),
            child: MyApp(),
          ),
        ),
        blocObserver: SimpleBlocObserver(),
      );
    },
    (Object error, StackTrace stackTrace) => Logger().logWarning('${error.toString()} $stackTrace'),
  );
}

【问题讨论】:

  • 我不确定。 di.init() 在哪里?
  • @Mahi 我添加了一些代码,但错误是一样的。你能再检查一下吗?
  • 你在 main 方法中调用了 initDependencies() 吗?
  • @Mahi 是的,我有
  • 请显示主要方法。

标签: flutter sharedpreferences service-locator


【解决方案1】:

好的,所以当您进行 blocTesting 时,您需要在其中的 setup 函数中再次注册您的包,如果您使用 getit 进行依赖注入。

【讨论】:

    猜你喜欢
    • 2022-11-25
    • 2021-09-04
    • 1970-01-01
    • 1970-01-01
    • 2014-08-17
    • 2021-12-31
    • 1970-01-01
    • 2012-09-08
    相关资源
    最近更新 更多