1. ホーム
  2. firebase

[解決済み] WidgetsFlutterBinding.ensureInitialized()は何をするのですか?

2023-05-17 21:58:36

質問

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 App '[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