Я пытаюсь создать простой поток аутентификации с помощью Provider. У меня три страницы:
- Страница авторизации
- Стартовая страница
- Главная страница
Поток этого приложения:
- если пользователь открывает приложение в первый раз, он будет перенаправлен на вход, а затем на главную.
- Во второй раз приложение сначала проверяет статус входа и перенаправляется либо на вход - ›домой, либо прямо на домашнюю страницу.
Вот моя настройка в коде:
main.dart
void main() {
runApp(MultiProvider(providers: [
ChangeNotifierProvider<StorageHelper>(create: (_) => StorageHelper()),
ChangeNotifierProvider<AuthProvider>(create: (_) => AuthProvider()),
], child: MyApp()));
}
class MyApp extends StatelessWidget {
Widget build(BuildContext context) {
return Consumer<AuthProvider>(builder: (final BuildContext context,
final AuthProvider authProvider, final Widget child) {
print(authProvider.isAuthenticated); // this is false whenever I //click the logout from category(or other pushed pages) but the below ternary //operation is not executing
return MaterialApp(
title: 'My Poor App',
debugShowCheckedModeBanner: false,
theme: ThemeData(
primaryColor: Color(0xff29c17e),
visualDensity: VisualDensity.adaptivePlatformDensity,
),
home: authProvider.isAuthenticated ? HomeScreen() : LoginScreen(),
onGenerateRoute: Router.onGenerateRoute,
);
});
}
}
LoginScreen.dart
class LoginScreen extends StatelessWidget {
@override
Widget build(BuildContext context) {
final authProvider = Provider.of<AuthProvider>(context, listen: false);
return Scaffold(
body: Center(
child: MaterialButton(
onPressed: () async {
await authProvider.emailLogin('[email protected]', 'pass');
},
child: Text('Login'))),
);
}
}
HomeScreen.dart
class HomeScreen extends StatelessWidget {
@override
Widget build(BuildContext context) {
final auth = Provider.of<AuthProvider>(context, listen: false);
return Scaffold(
body: Center(
child: MaterialButton(
elevation: 2,
onPressed: () {
Navigator.push(
context,
MaterialPageRoute(
builder: (context) => CategoryScreen()));
},
child: Text('Reset')),
),
);
}
}
AuthProvider.dart
class AuthProvider extends ChangeNotifier {
bool _isAuthenticated = false;
bool get isAuthenticated => _isAuthenticated;
set isAuthenticated(bool isAuth) {
_isAuthenticated = isAuth;
notifyListeners();
}
Future emailLogin(String email, String password) async {
isAuthenticated = true;
}
Future logout() async {
isAuthenticated = false;
}
}
Если я выхожу с домашней страницы с помощью Provider.of<AuthProvider>(context).logout()
, он работает нормально. Но если я push
или pushReplacement
выбираю новый маршрут и пытаюсь выйти из нового маршрута (просто скажем, что я перешел из дома на страницу категории и попытаюсь выйти оттуда), меня не перенаправят на LoginPage. Если я печатаю значение isAuthenticated
, оно выводит false, но потребитель не слушает или, по крайней мере, не реагирует на изменение переменной.
Пожалуйста, не помечайте этот вопрос как повторяющийся, я искал много других похожих вопросов, и ни один из них не помог в моем случае.
Изменить: CategoryScreen.dart
class CategoryScreen extends StatelessWidget {
@override
Widget build(BuildContext context) {
return Scaffold(
body: Center(
child: RaisedButton(
onPressed: () {
final auth = Provider.of<AuthProvider>(context, listen: false);
auth.logout();
// print(auth.isAuthenticated);
},
child: Text('Category Logout'),
),
),
);
}
}
Navigator
. При выходе изCategory
используйте Navigator.pushAndRemoveUntil или Navigator.pushNamedAndRemoveUntil после выхода из системы - person Alok   schedule 17.08.2020CategoryPage
? - person Alok   schedule 17.08.2020notifyListener
? Я уже меняю значениеisAuthenticated
, используя сеттер, а сеттер использует notifyListner. - person Suraj Khanal   schedule 17.08.2020notifyListener()
вlogout()
метод вAuthProvider
- person Alok   schedule 17.08.2020Navigator.pushAndRemoveUntil()
после выхода из системы? Не удалось увидеть это в коде вCategoryScreen
- person Alok   schedule 17.08.2020