Я пытаюсь реализовать индивидуальное решение для выхода из системы для своего приложения, где независимо от того, где в данный момент находится пользователь, после нажатия Logout button
приложение вернется к Login page
.
Моя идея заключалась в том, что вместо того, чтобы прослушивать каждый компонент для изменения состояния, у меня был бы один-единственный слушатель на главном компоненте -> MyApp
.
Для простоты я сократил количество элементов до минимума. Вот как мог бы выглядеть мой класс Profile:
class Profile with ChangeNotifier {
bool _isAuthentificated = false;
bool get isAuthentificated => _isAuthentificated;
set isAuthentificated(bool newVal) {
_isAuthentificated = newVal;
notifyListeners();
}
}
Теперь под Main
я зарегистрировал этого провайдера следующим образом:
void main() => runApp(
MultiProvider(
providers: [
ChangeNotifierProvider(
create: (_) => Profile(),
)
],
child: MyApp(),
),
);
И, наконец, MyApp
компонент:
class MyApp extends StatelessWidget {
// This widget is the root of your application.
@override
Widget build(BuildContext context) {
return Consumer<Profile>(
builder: (context, profile, _) {
return MaterialApp(
title: 'Flutter Demo',
theme: ThemeData(
brightness: Brightness.light,
primaryColor: Color.fromARGB(255, 0, 121, 107),
accentColor: Color.fromARGB(255, 255, 87, 34),
),
home: buildBasePage(context, profile),
);
},
);
}
Widget buildBasePage(BuildContext context, Profile currentProfile) {
return !currentProfile.isAuthentificated
? LoginComponent()
: MyHomePage(title: 'Flutter Demo Home Page test');
}
}
Моя идея заключалась в том, что, поскольку компонент MyApp
является главным, я должен иметь возможность создать потребителя, который будет уведомлен, если текущий пользователь аутентифицирован, и отреагирует соответствующим образом.
Что происходит, когда я, например, MyHomePage
, и я нажимаю Logout()
метод, который выглядит следующим образом:
void _logout() {
Provider.of<Profile>(context, listen: false).isAuthentificated = false;
}
Я ожидал, что при изменении свойства начальный компонент MyApp
отреагирует и сгенерирует LoginPage
; что не так. Я пробовал перейти с Consumer
на Provider.of<Profile>(context, listen: false)
, но с тем же результатом.
Что мне нужно сделать, чтобы эта концепция заработала? Это вообще правильно?
Я имею в виду, что я мог бы точно обновить свой класс Profile
, добавив следующий метод:
logout(BuildContext context) {
_isAuthentificated = false;
Navigator.push(
context, MaterialPageRoute(builder: (context) => LoginComponent()));
}
А затем просто позвоните Provider.of<Profile>(context, listen: false).logout()
, но я думал, что пакет Provider был разработан для этого ... или я что-то упускаю?
Любая помощь в этом вопросе будет более чем признательна.