WidgetsFlutterBinding.ensureInitialized() は何をしますか? 質問する

WidgetsFlutterBinding.ensureInitialized() は何をしますか? 質問する

以下のコード行で Firebase パッケージを使用しようとしています。

このコード行が実際に何をするのか本当に知りたいです。

公式ドキュメントはあまり役に立ちませんでした。誰か説明してくれませんか?

コードスニペット

ベストアンサー1

次のように使用する必要があります。

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

ここに画像の説明を入力してください

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

上の画像は Flutter のアーキテクチャ レイヤーです。 はWidgetFlutterBindingFlutter エンジンとのやり取りに使用されます。は Firebase を初期化するためにネイティブ コードを呼び出す必要があります。また、プラグインはネイティブ コードを呼び出すためにプラットフォーム チャネルを使用する必要があるため、これは非同期的に実行されます。そのため、 を呼び出して のインスタンスがあることを確認するFirebase.initializeApp()必要があります。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

おすすめ記事