WidgetsFlutterBinding.ensureInitialized()是做什么的?
WidgetsFlutterBinding.ensureInitialized()是做什么的?
我正在尝试使用Firebase包中的以下代码行。
我真的想知道这行代码实际上是干什么的?
官方文档没有帮我多少忙。 有人能解释一下吗?
你必须按照下面的方式使用它:
void main() async { WidgetsFlutterBinding.ensureInitialized(); await Firebase.initializeApp(); runApp(MyApp()); }
https://flutter.dev/docs/resources/architectural-overview#architectural-layers
以上图像展示了Flutter的架构层,WidgetFlutterBinding
用于与Flutter引擎进行交互。Firebase.initializeApp()
需要调用原生代码来初始化Firebase,由于插件需要使用平台通道来调用原生代码,这是异步完成的,因此您必须调用ensureInitialized()
来确保您具有WidgetsBinding
实例。
来自文档:
返回一个WidgetsBinding实例,如果有必要则创建并初始化之。如果创建了一个实例,它将是一个WidgetsFlutterBinding。如果先前已初始化,则至少会实现WidgetsBinding。
只有在调用runApp之前需要初始化绑定时才需要调用此方法。
来自源代码:
@override FutureinitializeApp( {String name, FirebaseOptions options}) async { if (name == defaultFirebaseAppName) { throw noDefaultAppInitialization(); } // Ensure that core has been initialized on the first usage of // initializeApp if (!isCoreInitialized) { await _initializeCore(); } // If no name is provided, attempt to get the default Firebase app instance. // If no instance is available, the user has not set up Firebase correctly for // their platform. if (name == null) { MethodChannelFirebaseApp defaultApp = appInstances[defaultFirebaseAppName]; if (defaultApp == null) { throw coreNotInitialized(); } return appInstances[defaultFirebaseAppName]; } assert(options != null, "FirebaseOptions cannot be null when creating a secondary Firebase app."); // Check whether the app has already been initialized if (appInstances.containsKey(name)) { throw duplicateApp(name); } _initializeFirebaseAppFromMap(await channel.invokeMapMethod( 'Firebase#initializeApp', {'appName': name, 'options': options.asMap}, )); return appInstances[name]; }
invokeMapMethod
将在上述通道上调用具有指定参数的方法,该方法将调用本机代码中的initializeApp()
方法,
https://github.com/FirebaseExtended/flutterfire/blob/master/packages/firebase_core/firebase_core/android/src/main/java/io/flutter/plugins/firebase/core/FlutterFirebaseCorePlugin.java#L227
还有其他初始化 Firebase 的方式,您可以在此处查看:
在 Flutter 和 Firebase 中没有创建“[DEFAULT]”Firebase 应用程序 - 调用 Firebase.initializeApp()
在其他方式中,我们不调用 WidgetsFlutterBinding.ensureInitialized()
,因为 runApp()
函数在内部调用它:
void runApp(Widget app) { WidgetsFlutterBinding.ensureInitialized() ..scheduleAttachRootWidget(app) ..scheduleWarmUpFrame(); }