Я пытаюсь реализовать собственное решение для выхода из системы для моего приложения, где, независимо от того, где находится пользователь в данный момент, после нажатия 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
является master , я смогу создать потребителя, который получит уведомление, если текущий пользователь аутентифицирован, и будет ответьте соответственно.
Что происходит, когда я нахожусь, например, в 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()
, однако я думал, что поставщик Пакет был разработан для этого ... или я что-то упустил?
Любая помощь в этом вопросе будет более чем признателен.