Flutter Flitter StreamBuilder对您的孩子有什么影响
根据我的理解,如果我有一个具有“FirebaseUser”流的StreamBuilder,它将在用户每次登录或注销时执行。但发生这种情况时,除(LoginScreen()和HomeScreen()之外的任何屏幕都不会重定向到正确的屏幕 我有一个注销按钮,我将故意使用这个按钮作为示例。在主屏幕()和另一屏幕()上。当我按下主屏幕上的注销按钮()时,我的应用程序将重定向到LoginScreen()问题是,当我尝试注销另一个屏幕()时,它实际上会注销,但不会重定向到LoginScreen()。 主飞镖Flutter Flitter StreamBuilder对您的孩子有什么影响,flutter,dart,Flutter,Dart,根据我的理解,如果我有一个具有“FirebaseUser”流的StreamBuilder,它将在用户每次登录或注销时执行。但发生这种情况时,除(LoginScreen()和HomeScreen()之外的任何屏幕都不会重定向到正确的屏幕 我有一个注销按钮,我将故意使用这个按钮作为示例。在主屏幕()和另一屏幕()上。当我按下主屏幕上的注销按钮()时,我的应用程序将重定向到LoginScreen()问题是,当我尝试注销另一个屏幕()时,它实际上会注销,但不会重定向到LoginScreen()。 主飞镖
返回StreamBuilder(
流:FirebaseAuth.instance.onAuthStateChanged,
生成器:(上下文,异步快照){
//处死他人。。
最终用户=snapshot.data;
如果(用户!=null){
返回主屏幕();
}否则{
返回LoginScreen();
}
}
)
主屏幕.省道
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()));
}
),
],
),
),
);
返回脚手架(
主体:容器(
子:列(
crossAxisAlignment:crossAxisAlignment.center,
mainAxisAlignment:mainAxisAlignment.center,
儿童:[
升起的按钮(
onPressed:()=>FirebaseAuth.instance.signOut(),
子项:文本('Signout'),
),
升起的按钮(
子项:文本(“转到另一个屏幕()”)
新闻界:(){
push(上下文,MaterialPage路由(生成器:(\u)=>AnotherScreen());
}
),
],
),
),
);
另一个屏幕
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'),
),
],
),
),
);
返回脚手架(
主体:容器(
子:列(
crossAxisAlignment:crossAxisAlignment.center,
mainAxisAlignment:mainAxisAlignment.center,
儿童:[
文本(“另一个屏幕”)
升起的按钮(
onPressed:()=>FirebaseAuth.instance.signOut(),
子项:文本('Signout'),
),
],
),
),
);
我花了很多时间去理解正在发生的事情,也许我不明白颤振是如何工作的。那么,每个新屏幕是否都独立运行,我是否需要手动推送页面?我相信您的问题是,它实际上显示的是
登录屏幕,但仅显示在堆栈中的上一个屏幕上
我建议您在另一个屏幕中尝试此操作。dart
:
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'),
),
],
),
),
);
返回脚手架(
主体:容器(
子:列(
crossAxisAlignment:crossAxisAlignment.center,
mainAxisAlignment:mainAxisAlignment.center,
儿童:[
文本(“另一个屏幕”)
升起的按钮(
已按下:(){
//这将删除屏幕,直到它到达您的主页/登录屏幕
Navigator.popintil(context,(route)=>route.isFirst);
返回FirebaseAuth.instance.signOut();
},
子项:文本('Signout'),
),
],
),
),
);
如果不想从堆栈中删除屏幕,则可能需要在另一个屏幕周围添加StreamBuilder
:
返回StreamBuilder(
流:FirebaseAuth.instance.onAuthStateChanged,
生成器:(上下文,异步快照){
最终用户=snapshot.data;
如果(用户!=null){
返回脚手架(
主体:容器(
子:列(
crossAxisAlignment:crossAxisAlignment.center,
mainAxisAlignment:mainAxisAlignment.center,
儿童:[
文本(“另一个屏幕”)
升起的按钮(
onPressed:()=>FirebaseAuth.instance.signOut(),
子项:文本('Signout'),
),
],
),
),
);
}否则{
返回LoginScreen();
}
}
);
PS:我还没有测试过,让我知道这是否适用于您。是的,当然您需要手动推送页面,否则用户只会被记录,但会出现在UI中。@HiwaJalal但是为什么在LoginScreen和HomeScreen中,如果重定向屏幕的流程自动工作,并且在更多屏幕中不一样呢?您可以扩展您的答案,这样我就可以理解并适当地标记它,谢谢。您在github中有您的项目代码吗?