【发布时间】:2021-01-09 19:13:51
【问题描述】:
如果提供的布尔值 (isLoggedIn) 更改为 true,我想从该屏幕导航到新屏幕。下面的第一个构建方法不可能,因为在构建过程中无法调用 Navigator。我试图在构建中执行此操作,因为我需要访问上下文才能使用我的提供程序。来自 Authorization 提供者的 isLoggedIn 的值可能随时更改,因此我必须对此进行检查。
如何使用提供者和导航器解决这个问题?
//Not working solution
Widget build(BuildContext context) {
Authorization auth = Provider.of<Authorization>(context);
return Scaffold(
body: Center(
child: auth.isLoggedIn
? Text(
"Logged In",
)
: Navigator.pushReplacementNamed(context, 'sign-in')),
);
}
我可以在没有 Navigator 的情况下这样做:
//Working solution
class SplashScreen extends StatelessWidget {
static const routeName = 'splash';
@override
Widget build(BuildContext context) {
final auth = Provider.of<Authorization>(context);
return auth.isLoggedIn ? HomeScreen() : SignInScreen();
}
}
但如果那是一种可靠的方法,我现在不这样做。
【问题讨论】:
-
您将 UI 代码与功能代码混合在一起。你不能这样做。如果应该在构建方法之外。您应该检查用户是否已登录,然后导航到另一个视图,或者如果用户未登录,请导航到登录页面。
-
我知道我必须删除构建方法之外的导航器,正如我在问题中所说的那样。由于我不知道提供的值何时发生变化,您将把这张支票放在哪里?
标签: flutter flutter-provider flutter-navigation