Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/flutter/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Flutter Flitter StreamBuilder对您的孩子有什么影响_Flutter_Dart - Fatal编程技术网

Flutter Flitter StreamBuilder对您的孩子有什么影响

Flutter Flitter StreamBuilder对您的孩子有什么影响,flutter,dart,Flutter,Dart,根据我的理解,如果我有一个具有“FirebaseUser”流的StreamBuilder,它将在用户每次登录或注销时执行。但发生这种情况时,除(LoginScreen()和HomeScreen()之外的任何屏幕都不会重定向到正确的屏幕 我有一个注销按钮,我将故意使用这个按钮作为示例。在主屏幕()和另一屏幕()上。当我按下主屏幕上的注销按钮()时,我的应用程序将重定向到LoginScreen()问题是,当我尝试注销另一个屏幕()时,它实际上会注销,但不会重定向到LoginScreen()。 主飞镖

根据我的理解,如果我有一个具有“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中有您的项目代码吗?