繁体   English   中英

WidgetsFlutterBinding.ensureInitialized() 有什么作用?

[英]What Does WidgetsFlutterBinding.ensureInitialized() do?

我正在尝试使用带有以下代码行的 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
  Future<FirebaseAppPlatform> 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',
      <String, dynamic>{'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 的方法,您可以在此处查看:

尚未创建 Firebase 应用“[DEFAULT]” - 在 Flutter 和 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

一个简单的答案是,如果 Flutter 在调用 runApp 之前需要调用原生代码

WidgetsFlutterBinding.ensureInitialized() ;

确保您有一个 WidgetsBinding 的实例,这是使用平台通道调用本机代码所必需的。

如果您需要在调用 runApp 之前初始化绑定,则只需调用此方法。

一个简单的答案,如果您的主函数使用 async 关键字,因为您在其中使用了 await 语句,则需要使用这一行。

Future<void> main() async {
  WidgetsFlutterBinding.ensureInitialized();
  SharedPreferences prefs = await SharedPreferences.getInstance(); // just an example
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM