ベストアンサー1
次のように使用する必要があります。
void main() async {
WidgetsFlutterBinding.ensureInitialized();
await Firebase.initializeApp();
runApp(MyApp());
}
https://flutter.dev/docs/resources/architectural-overview#architectural-layers
上の画像は Flutter のアーキテクチャ レイヤーです。 はWidgetFlutterBinding
Flutter エンジンとのやり取りに使用されます。は 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();
}