我有一個起始小部件的以下工件:
import 'package:firebase_auth/firebase_auth.dart';
import 'package:firebase_core/firebase_core.dart';
import 'package:flutter/material.dart';
import 'firebase_options.dart';
import 'apps/auth_app.dart';
import 'apps/main_app.dart';
class StartingWidget extends StatelessWidget {
const StartingWidget({super.key});
void _initFirebase() async {
//WidgetsFlutterBinding.ensureInitialized();
await Firebase.initializeApp();
}
void _addAuthStatusListener() {
try {
FirebaseAuth.instance.authStateChanges().listen((User? user) {
if (user != null) {
//runApp(const MainApp());
} else {
//runApp(const AuthApp());
}
});
} catch (e) {
print(e.toString());
}
}
@override
Widget build(BuildContext context) {
_initFirebase();
_addAuthStatusListener();
return const Scaffold(
body: CircularProgressIndicator(),
);
}
}
當我在 Android 模擬器上啟動它時,出現“No Firebase App '[DEFAULT]' has been created”錯誤
FirebaseAuth.instance.authStateChanges().listen((User? user) {
盡管Firebase.initializeApp()
之前被呼叫過。取消注釋
WidgetsFlutterBinding.ensureInitialized();
不會改變任何東西。
uj5u.com熱心網友回復:
原因很簡單:
_initFirebase()
在呼叫_addAuthStatusListener()
使用 Firebase 應用程式之前,您還沒有等待完成!
你也不能在你的構建方法中等待(它必須立即渲染,因此不能是異步的),所以我建議你_initFirebase()
從內部呼叫_addAuthStatusListener()
:
@override
Widget build(BuildContext context) {
// _initFirebase(); // <- Remove this here!
_addAuthStatusListener();
return const Scaffold(
body: CircularProgressIndicator(),
);
}
...
void _addAuthStatusListener() async { // Make async!
await _initFirebase(); // <- Add _initFirebase() here, with "await"!
try {
FirebaseAuth.instance.authStateChanges().listen((User? user) {
if (user != null) {
//runApp(const MainApp());
} else {
//runApp(const AuthApp());
}
});
} catch (e) {
print(e.toString());
}
}
應該這樣做!??
說明
關于異步函式,您必須了解的是,在沒有await
關鍵字的情況下呼叫它們只會啟動它們。然后,讀者繼續,不等他們讀完。同時,異步函式也繼續使用它自己的東西,與主閱讀器并行,直到它完成。
所以,在你上面的例子中,你開始了_initFirebase()
,在里面,一個讀者坐下來等待Firebase.initializeApp()
完成。但在此程序中,主要讀者繼續閱讀該build()
方法的下一行,即_addAuthStatusListener()
. 在所述初始化有機會完成之前,該函式有足夠的時間到達需要完全初始化的 Firebase 應用程式的位置(出現錯誤的行)。
稍后,該Firebase.initializeApp()
命令將完成,不久之后整個_initFirebase()
功能將完成,但到那時,您的應用程式已經崩潰。
然而,在前面添加“await”_initFirebase()
可以確保讀者在這個函式完成之前不能繼續下一行,即使它是異步的。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/512570.html
標籤:Google Cloud Collective 扑火力基地镖firebase 身份验证