我在应用程序的主页/根页面中有一个流生成器。每当我在别处进行页面导航时,都会触发此流构建器,这与流本身无关。
根据here和here,我的理解是,当在导航器中弹出/推送页面时,它会触发应用程序的重建,因此流构建器会重新连接并触发。然而,这似乎效率低下,那么有没有办法防止在弹出/推送页面时触发流构建器?
此外,根据日志,当我推送页面时,首先构建并显示页面,然后触发流构建器。然而,流构建器的小部件/页面根本不显示,即使日志/调试器清楚地显示流构建器的小部件已返回。它去哪儿了?它在 Flutter 框架中是如何工作的?
以下是完整的代码和日志。该代码使用 Firebase 身份验证作为流构建器。
代码:
import 'package:flutter/material.dart';
import 'package:firebase_auth/firebase_auth.dart';
void main() => runApp(MyApp());
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
title: 'Flutter Demo',
theme: ThemeData(
primarySwatch: Colors.blue,
),
home: AppHomePage(),
);
}
}
class AppHomePage extends StatelessWidget {
@override
Widget build(BuildContext context) {
final FirebaseAuth auth = FirebaseAuth.instance;
return StreamBuilder<FirebaseUser>(
stream: auth.onAuthStateChanged,
builder: (_, AsyncSnapshot<FirebaseUser> snapshot) {
if (snapshot.connectionState == ConnectionState.active) {
final FirebaseUser user = snapshot.data;
if (user == null) {
debugPrint("User is NULL.");
return SignInPage();
} else {
debugPrint("User exists.");
return MainPage();
}
} else {
debugPrint("In waiting state.");
return Scaffold(
body: Center(
child: CircularProgressIndicator(),
),
);
}
},
);
}
}
class MainPage extends StatelessWidget {
@override
Widget build(BuildContext context) {
debugPrint("Building main page.");
return Scaffold(
body: Center(
child: Text("Welcome to our app!"),
),
);
}
}
class SignInPage extends StatelessWidget {
@override
Widget build(BuildContext context) {
debugPrint("Building sign-in page.");
return Scaffold(
body: Center(
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: <Widget>[
FlatButton(
color: Colors.blue,
child: Text('Sign In as Anonymous'),
onPressed: () {
debugPrint("Anonymous");
Navigator.push(
context,
MaterialPageRoute(builder: (context) => MainPage()),
);
},
),
FlatButton(
color: Colors.red,
child: Text('Sign In with Google'),
onPressed: () => debugPrint("Google"),
),
],
),
),
);
}
}
日志,其中第 4 行表示按下按钮执行 navigator.pop():
I/flutter (22339): In waiting state.
I/flutter (22339): User is NULL.
I/flutter (22339): Building sign-in page.
I/flutter (22339): Anonymous
I/flutter (22339): Building main page.
I/flutter (22339): User is NULL.
I/flutter (22339): Building sign-in page.