Таким образом, у меня есть проблема, аналогичная той, которая задала этот старый вопрос , за исключением тех требований, с которыми ни один из ответов не помог.
Когда пользователь открывает приложение, Я хочу, чтобы их приветствовали со страницей входа в систему, если они не вошли в систему, или домашней страницей (вид нижней навигационной панели), если они это сделали. Я могу определить это в 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
вместо простого нажатия, нажатие назад откроет пустой экран (вместо закрытия приложения).
Есть ли способ сделать это правильно, чтобы он работал как в Интернете, так и на мобильных устройствах