我如何使用 Stream Builder 来替换 Navigator 推送的小部件?

How do I use Stream Builder to also replace the pushed widgets from Navigator?

我正在使用对 Firebase 用户状态做出反应的流生成器​​。我在“登陆屏幕”中,然后将“登录屏幕”推到它上面。在我登录后,Stream Builder 将“登陆屏幕”正确替换为“发现屏幕”。但是,推送的“登录屏幕”仍然位于“发现屏幕”之上。

如何使用 Stream Builder 来替换 Navigator 推送的小部件?

代码如下:

class HomeScreen extends StatelessWidget {
  const HomeScreen({Key? key}) : super(key: key);

  @override
  Widget build(BuildContext context) {
    final AuthService _authService = GetIt.I.get<AuthService>();
    return Scaffold(
      body: StreamBuilder(
        stream: _authService.userStream,
        builder: (context, snapshot) {
          if (snapshot.connectionState == ConnectionState.waiting) {
            return const LoadingScreen();
          } else if (snapshot.hasError) {
            return const ErrorScreen();
          } else if (snapshot.hasData) {
            return const DiscoverScreen();
          } else {
            return const LandingScreen(); // I push the Login Screen inside this screen
          }
        },
      ),
    );
  }
}

你会尝试这个代码我认为你应该在你的 MaterialApp(home: here...) 中尝试这个如果你想在开始时尝试你的应用程序。

StreamBuilder(
    stream: _authService.userStream,
    builder: (context, snapshot) => 
authResultSnapshot.connectionState ==
                          ConnectionState.waiting
                      ? LoadingScreen : LandingScreen()
{
      if (snapshot.connectionState == ConnectionState.waiting) {
        return const LoadingScreen();
      } else if (snapshot.hasError) {
        return const ErrorScreen();
      } else if (snapshot.hasData) {
        return const DiscoverScreen();
      } else {
        if(snapshot.connectionState == ConnectionState.done){
          // your loginScreen();
        } else{
          return const LandingScreen(); // I push the Login Screen inside this screen
        }
        
      }
    },
  ),

你能展示一下如何将 LoginScreen 推到 LandingScreen 之上的代码吗?如果您使用的是 Navigator,则需要关闭 LoginScreen,以便渲染 HomeScreen,它返回其中的 DiscoverScreen(视图)。

如果是这种情况,您可以使用 Navigator.of(context).popUntil(ModalRoute.withName('/homescreen'));

关闭 LoginScreen

除了将 MediaRoute.withName('...') 替换为您的 HomeScreen 路线的名称。

或者,您可以使用 StreamBuilder 来覆盖应该显示登录的状态。