如何在 Flutter 中使用 SharedPreferences 和 Injectable?

Sil*_*ui. 4 dependency-injection sharedpreferences flutter

我在 flutter 中使用 Injectable 库进行依赖注入,但收到错误,无法使用 SharedPreferences。

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

  Future<SharedPreferences> get prefs => SharedPreferences.getInstance();
Run Code Online (Sandbox Code Playgroud)

我尝试将 WidgetsFlutterBinding.ensureInitialized()

void main() { 
  WidgetsFlutterBinding.ensureInitialized();
  configureInjection(Environment.prod);
  runApp(MyApp());
}
Run Code Online (Sandbox Code Playgroud)

Dav*_*ing 7

SharedPreference您可以通过注释来预先等待未来@preResolve

@module
abstract class InjectionModule {

//injecting third party libraries
   @preResolve
   Future<SharedPreferences> get prefs => SharedPreferences.getInstance();
}
Run Code Online (Sandbox Code Playgroud)

以及在configureInjection课堂上

final GetIt getIt = GetIt.instance;

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

以及主课上

void main() async {
 WidgetsFlutterBinding.ensureInitialized();
 await configureInjection(Environment.prod);
 runApp(MyApp());
}
Run Code Online (Sandbox Code Playgroud)

实际使用:

final prefs = getIt<SharedPreferences>();
await prefs.setString('city', city);
Run Code Online (Sandbox Code Playgroud)

不是:

final module = getIt<InjectionModule>();
module.prefs.setString('test', test);
Run Code Online (Sandbox Code Playgroud)

SharedPreferences注意和之间的差异InjectionModule