如何在Flutter中使用SharedPreferences和Injectable?

时间:2020-05-10 05:09:38

标签: flutter dependency-injection sharedpreferences

我在扑扑中使用库Injectable进行依赖注入,但是在无法使用SharedPreferences时出现错误。

错误: 发生异常。 在初始化绑定之前,先访问FlutterError(ServicesBinding.defaultBinaryMessenger。 如果您正在运行应用程序并且需要在调用runApp()之前(例如,在插件初始化期间)访问二进制Messenger,则需要首先显式调用WidgetsFlutterBinding.ensureInitialized()。 如果您正在运行测试,则可以将TestWidgetsFlutterBinding.ensureInitialized()作为测试的main()方法的第一行来初始化绑定。) 我尝试创建一个类,并将@lazySingleton

  Future<SharedPreferences> get prefs => SharedPreferences.getInstance();

然后我尝试将WidgetsFlutterBinding.ensureInitialized()

void main() { 
  WidgetsFlutterBinding.ensureInitialized();
  configureInjection(Environment.prod);
  runApp(MyApp());
}

2 个答案:

答案 0 :(得分:0)

下面是我使其工作的方式,不能保证这是最好的方法。

等待main方法中的configureInjection方法。

void main() async {
  WidgetsFlutterBinding.ensureInitialized();
  await configureInjection(Env.prod);
  runApp(App());
}

然后将您的应用包装到使用getIt.allReady()的FutureBuilder中。

Widget build(context) {
  return FutureBuilder(
    future: getIt.allReady(),
    builder: (context, snapshot) {
      if (snapshot.hasData) {
        // ... your app widgets
      } else {
        // ... some progress indicator widget
      }
    }
  );
}

帮助链接:

答案 1 :(得分:0)

您可以通过SharedPreference进行注释来{@ {1}}中预先等待未来

@preResolve

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

configureInjection

以及主要班级

final GetIt getIt = GetIt.instance;

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