【发布时间】:2021-10-01 08:49:18
【问题描述】:
我正在关注 FlutterFire 入门 - https://firebase.flutter.dev/docs/overview。
当我在initializing flutter fire 运行示例代码时,FutureBuilder 被调用了 3 次,第一次为 snapshot.connectionState 等待,第二次和第三次为 snapshot.connectionState 完成。
我不明白为什么用 snapshot.connectionState == ConnectionState.done 调用 FutureBuilder 两次的原因
以下是我的代码,与 FlutterFire 入门页面中的示例完全相同。
import 'package:flutter/material.dart';
import 'package:firebase_core/firebase_core.dart';
import 'package:firebase_auth/firebase_auth.dart';
void main() {
WidgetsFlutterBinding.ensureInitialized();
runApp(App());
}
class App extends StatefulWidget {
@override
_AppState createState() => _AppState();
}
class _AppState extends State<App> {
final Future<FirebaseApp> _initialization = Firebase.initializeApp();
@override
Widget build(BuildContext context) {
return FutureBuilder(
future: _initialization,
builder: (coontext, snapshot) {
if (snapshot.hasError) {
Text("snapshot error. $snapshot");
}
if (snapshot.connectionState == ConnectionState.done) {
// this is printed twice!!
print("Initialize Firebase Done!!");
return MyHome();
}
return Loading();
}
);
}
}
class Loading extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
home: Scaffold(
body: Center(
child: Container(
child: Text("Loading..."),
),
),
)
);
}
}
class MyHome extends StatefulWidget {
@override
_MyHomeState createState() => _MyHomeState();
}
class _MyHomeState extends State {
@override
void initState() {
FirebaseAuth
.instance
.idTokenChanges()
.listen((User? user) {
if (user == null) {
print('User is signed out');
} else {
print('User is signed in!.' + user.displayName!);
}
});
super.initState();
}
@override
Widget build(BuildContext context) {
return MaterialApp(
home: Scaffold(
body: Text('hello'),
)
);
}
}
【问题讨论】:
-
@SonuKumar 谢谢你的链接。我测试了 FutureBuilder 并且我知道当
Widget build()被称为builder在FutureBuilder中也被称为 ConnectionState.done。如果初始化过程完成,我预计_initialization(未来实例)会触发builder仅一次。