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)
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。