WidgetsFlutterBinding.ensureInitialized()是做什么的?

8 浏览
0 Comments

WidgetsFlutterBinding.ensureInitialized()是做什么的?

我正在尝试使用Firebase包中的以下代码行。

我真的想知道这行代码实际上是干什么的?

官方文档没有帮我多少忙。 有人能解释一下吗?

\"Code

admin 更改状态以发布 2023年5月22日
0
0 Comments

简单的回答是如果Flutter需要在调用runApp之前调用本地代码。调用WidgetsFlutterBinding.ensureInitialized()会确保你有一个WidgetsBinding实例,这是使用平台通道调用本地代码所必需的。只需要在调用runApp之前调用这个方法。

0
0 Comments

你必须按照下面的方式使用它:

void main() async {
  WidgetsFlutterBinding.ensureInitialized();
  await Firebase.initializeApp();
  runApp(MyApp());
}

enter image description here

https://flutter.dev/docs/resources/architectural-overview#architectural-layers

以上图像展示了Flutter的架构层,WidgetFlutterBinding用于与Flutter引擎进行交互。Firebase.initializeApp()需要调用原生代码来初始化Firebase,由于插件需要使用平台通道来调用原生代码,这是异步完成的,因此您必须调用ensureInitialized()来确保您具有WidgetsBinding实例。

来自文档

返回一个WidgetsBinding实例,如果有必要则创建并初始化之。如果创建了一个实例,它将是一个WidgetsFlutterBinding。如果先前已初始化,则至少会实现WidgetsBinding。

只有在调用runApp之前需要初始化绑定时才需要调用此方法。


来自源代码

  @override
  Future initializeApp(
      {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();
}

https://github.com/flutter/flutter/blob/bbfbf1770c/packages/flutter/lib/src/widgets/binding.dart#L1012

0