如何在 Flutter 中使用 SharedPreferences 和 Injectable?
Posted
技术标签:
【中文标题】如何在 Flutter 中使用 SharedPreferences 和 Injectable?【英文标题】:How to use SharedPreferences and Injectable in Flutter? 【发布时间】:2020-08-25 16:20:03 【问题描述】:我在 Flutter 中使用库 Injectable 进行依赖注入,但在无法使用 SharedPreferences 时出现错误。
错误:
发生异常。
FlutterError(在初始化绑定之前访问了ServicesBinding.defaultBinaryMessenger。
如果您正在运行一个应用程序并且需要在调用runApp()
之前访问二进制信使(例如,在插件初始化期间),那么您需要首先显式调用WidgetsFlutterBinding.ensureInitialized()
。
如果您正在运行测试,您可以调用 TestWidgetsFlutterBinding.ensureInitialized()
作为测试的 main()
方法的第一行来初始化绑定。)
我试过创建一个类并把@lazySingleton
Future<SharedPreferences> get prefs => SharedPreferences.getInstance();
我试着把 WidgetsFlutterBinding.ensureInitialized()
void main()
WidgetsFlutterBinding.ensureInitialized();
configureInjection(Environment.prod);
runApp(MyApp());
【问题讨论】:
【参考方案1】:您可以在SharedPreference
中通过注释@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);
还有主课
void main() async
WidgetsFlutterBinding.ensureInitialized();
await configureInjection(Environment.prod);
runApp(MyApp());
【讨论】:
【参考方案2】:以下是我得到它的工作方式,不保证它是最好的方法。
等待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
);
有用的链接:
https://pub.dev/documentation/injectable/latest/#registering-asynchronous-injectables https://pub.dev/packages/get_it#synchronizing-asynchronous-initialisations-of-singletons【讨论】:
以上是关于如何在 Flutter 中使用 SharedPreferences 和 Injectable?的主要内容,如果未能解决你的问题,请参考以下文章
如何使用 flutter_webview 插件在 Flutter 中启用位置?
如何在flutter中使用flutter_webview_plugin和AndroidX
Flutter-如何在flutter的整个应用程序生命周期中将数据保存在内存中?
如何在 Flutter 中使用 GestureDetector 隐藏 appBar?
如何在 Flutter 的原生 C++ 中使用 OpenCV 4(2021 年)(支持 Flutter 2.0)? [关闭]