【发布时间】:2020-02-28 15:48:17
【问题描述】:
所以我和问this older question 的人有类似的问题,除了有不同的要求,那里的答案都没有帮助。
当用户打开应用程序时,如果他们没有登录,我希望他们看到登录页面,如果他们登录了,我希望他们看到主页(底部导航栏视图)。我可以在MaterialApp 中定义如下:
MaterialApp(
initialRoute: authProvider.isAuthenticated
? '/home'
: '/login',
routes: {
'/home': (_) =>
ChangeNotifierProvider<BottomNavigationBarProvider>(
child: AppBottomNavigationBar(),
create: (_) => BottomNavigationBarProvider()),
'/login': (_) => LoginView()
},
)
到目前为止一切顺利。除了我想让它在网络上工作,现在即使用户第一次打开myapp.com 时的默认屏幕是myapp.com/#/login,任何用户都可以通过简单地访问myapp.com/#/home 绕过登录屏幕。
现在我尝试将用户重定向到底部导航栏的initState() 中的登录页面(并将initialRoute 设置为/home),但在移动设备上这会出现不良行为。
如果我试试这个:
void initState() {
super.initState();
if (!Provider.of<AuthProvider>(context, listen: false).isAuthenticated) {
SchedulerBinding.instance.addPostFrameCallback((_) {
Navigator.of(context).pushNamed('/login');
});
}
}
然后只需按返回即可将用户返回到主页,再次绕过登录。如果我尝试使用popAndPushNamed 而不是仅仅按下,按下返回将打开一个空白屏幕(而不是关闭应用程序)。
有什么方法可以正确地做到这一点,使其同时适用于网络和移动设备?
【问题讨论】:
-
试试
pushReplacementNamed
标签: flutter dart flutter-web mobile-development