据我了解的逻辑,如果我有一个具有“ FirebaseUser”流的StreamBuilder,它将在用户每次登录或注销时执行。但是,发生这种情况时,除了(LoginScreen()和HomeScreen())之外的任何其他屏幕都不会重定向到正确的屏幕。
我有一个注销按钮,我将在示例中使用此按钮。在HomeScreen()和AnotherScreen()上。当我按下HomeScreen()上的Logout按钮时,我的应用程序将重定向到LoginScreen()。 问题在于,当我尝试注销AnotherScreen()时,它实际上已注销,但没有重定向到LoginScreen()。
主镖ls -lah <PATH_TO>/cmd
主屏幕.dart
return StreamBuilder<FirebaseUser>(
stream: FirebaseAuth.instance.onAuthStateChanged,
builder: (context, AsyncSnapshot<FirebaseUser> snapshot) {
// execute others..
final user = snapshot.data;
if (user != null) {
return HomeScreen();
} else {
return LoginScreen();
}
}
)
AnotherScreen.dart
return Scaffold(
body: Container(
child: Column(
crossAxisAlignment: CrossAxisAlignment.center,
mainAxisAlignment: MainAxisAlignment.center,
children: <Widget>[
RaisedButton(
onPressed: () => FirebaseAuth.instance.signOut(),
child: Text('Signout'),
),
RaisedButton(
child: Text("Go to AnotherScreen()")
onPress: () {
Navigator.push(context, MaterialPageRoute(builder: (_) => AnotherScreen()));
}
),
],
),
),
);
我花了很多时间去了解正在发生的事情,也许我不明白颤动是如何工作的。那么每个新屏幕的行为是否独立,我是否需要手动推送页面?
答案 0 :(得分:1)
我相信您的问题是它实际上显示了LoginScreen
,但仅显示在堆栈中的前一个屏幕上。
我建议您在AnotherScreen.dart
内尝试一下:
return Scaffold(
body: Container(
child: Column(
crossAxisAlignment: CrossAxisAlignment.center,
mainAxisAlignment: MainAxisAlignment.center,
children: <Widget>[
Text('Another Screen')
RaisedButton(
onPressed: () {
// This will remove screens until it reaches your home/login screen
Navigator.popUntil(context, (route) => route.isFirst);
return FirebaseAuth.instance.signOut();
},
child: Text('Signout'),
),
],
),
),
);
如果您不想从堆栈中删除屏幕,则可能需要在StreamBuilder
周围添加AnotherScreen
:
return StreamBuilder<FirebaseUser>(
stream: FirebaseAuth.instance.onAuthStateChanged,
builder: (context, AsyncSnapshot<FirebaseUser> snapshot) {
final user = snapshot.data;
if (user != null) {
return Scaffold(
body: Container(
child: Column(
crossAxisAlignment: CrossAxisAlignment.center,
mainAxisAlignment: MainAxisAlignment.center,
children: <Widget>[
Text('Another Screen')
RaisedButton(
onPressed: () => FirebaseAuth.instance.signOut(),
child: Text('Signout'),
),
],
),
),
);
} else {
return LoginScreen();
}
}
);
PS:我尚未测试过,请告诉我这是否适合您。