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

时间:2020-07-26 14:40:05

标签: flutter dart

据我了解的逻辑,如果我有一个具有“ 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()));
          }
        ),
      ],
    ),
  ),
);

我花了很多时间去了解正在发生的事情,也许我不明白颤动是如何工作的。那么每个新屏幕的行为是否独立,我是否需要手动推送页面?

1 个答案:

答案 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:我尚未测试过,请告诉我这是否适合您。