我如何使用 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
来覆盖应该显示登录的状态。
我正在使用对 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
来覆盖应该显示登录的状态。