我正在尝试为我的应用程序实现自定义注销解决方案,无论用户当前在哪里,一旦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()
,但是我认为 Provider 包是为此设计的......或者我错过了什么?
任何有关此事的帮助将不胜感激。