[解決済み] WidgetsFlutterBinding.ensureInitialized()は何をするのですか?
質問
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();
}
関連
-
[解決済み] Firebase Firestoreの「参照」データ型は何に適していますか?
-
[解決済み】FirebaseInstanceIdServiceは非推奨です。
-
[解決済み】Firebaseで複数のwhere句に基づくクエリ
-
[解決済み] constコンストラクタは実際にどのように動作するのですか?
-
[解決済み] タイプ 'List<dynamic>' はタイプ 'List<Widget>' のサブタイプではありません。
-
[解決済み] HTTPエラー。401 android プロジェクトで firebase cloud の機能を設定する際に発生するエラー。
-
[解決済み] .firebase/hostingの目的は何ですか?ALPHANUM.cache
-
[解決済み] Firebaseストレージアーティファクト
-
[解決済み] 追加される前のIDを取得することはできますか?
-
[解決済み] Firebase 3 - 異常な活動のため、このデバイスからのすべてのリクエストをブロックしています。
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】Firebase v3 updateProfile メソッド
-
[解決済み] エラーです。Objective-Cモジュール'Firebase'をビルドできませんでした。
-
[解決済み] Cloud FirestoreとFirebase Realtime Databaseの違いとは?
-
[解決済み】Firebase App '[DEFAULT]' が作成されていない - Flutter と Firebase で Firebase.initializeApp() を呼び出す。
-
[解決済み] Firebase Cloud MessagingのAPI KEYはどこにありますか?
-
[解決済み] どうしたら解決できますか?Error: Firebase プロジェクトのリストアップに失敗しました。詳細はfirebase-debug.logを参照してください。
-
[解決済み] HTTPエラー。401 android プロジェクトで firebase cloud の機能を設定する際に発生するエラー。
-
[解決済み] 他の関数に影響を与えずに、いくつかの関数をCloud Functions for Firebaseにデプロイするには?
-
[解決済み] Firebaseストレージアーティファクト
-
[解決済み] firestoreでジオ "near "クエリを実行するには?