我正在尝试为我的应用程序实现自定义注销解决方案,无论用户当前在哪里,只要Logout button单击,应用程序都将导航回Login page。
Logout button
Login page
我的想法是,与其在每个组件上侦听状态变化,不如在主组件上有一个侦听器-> MyApp。
MyApp
为了简单起见,我将项目减少到最低限度。这是我的Profile类的样子:
class Profile with ChangeNotifier { bool _isAuthentificated = false; bool get isAuthentificated => _isAuthentificated; set isAuthentificated(bool newVal) { _isAuthentificated = newVal; notifyListeners(); } }
现在,在下Main,我已经将该提供者注册如下:
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组件是 主服务器 ,我应该能够创建使用者,如果当前用户已通过身份验证,则该使用者将得到通知,并做出相应的响应。
发生的是,当我进入例如MyHomePagecomponent并单击Logout()如下所示的方法时:
MyHomePage
Logout()
void _logout() { Provider.of<Profile>(context, listen: false).isAuthentificated = false; }
我期望在更改属性时,初始MyApp组件会做出反应并生成LoginPage;事实并非如此。我尝试从更改为Consumer,Provider.of<Profile>(context, listen: false)但结果相同。
LoginPage
Consumer
Provider.of<Profile>(context, listen: false)
为了使该概念生效,我需要做什么?这样做是否正确?
我的意思是,我肯定可以Profile以某种方式更新我的课程,即添加以下方法:
Profile
logout(BuildContext context) { _isAuthentificated = false; Navigator.push( context, MaterialPageRoute(builder: (context) => LoginComponent())); }
然后简单地调用Provider.of<Profile>(context, listen: false).logout(),但是我认为Provider程序包是为此设计的……还是我缺少了什么?
Provider.of<Profile>(context, listen: false).logout()
在这方面的任何帮助将不胜感激。
我不知道为什么它对您不起作用。这是我根据您的描述构建的完整示例。有用!
import 'package:flutter/material.dart'; import 'package:provider/provider.dart'; class Profile with ChangeNotifier { bool _isAuthentificated = false; bool get isAuthentificated { return this._isAuthentificated; } set isAuthentificated(bool newVal) { this._isAuthentificated = newVal; this.notifyListeners(); } } void main() { return runApp( MultiProvider( providers: [ ChangeNotifierProvider<Profile>( create: (final BuildContext context) { return Profile(); }, ) ], child: MyApp(), ), ); } class MyApp extends StatelessWidget { @override Widget build(final BuildContext context) { return Consumer<Profile>( builder: (final BuildContext context, final Profile profile, final Widget child) { return MaterialApp( title: 'Flutter Demo', theme: ThemeData(primarySwatch: Colors.blue), home: profile.isAuthentificated ? MyHomePage() : MyLoginPage(), ); }, ); } } class MyHomePage extends StatelessWidget { @override Widget build(final BuildContext context) { return Scaffold( appBar: AppBar(title: const Text("Home [Auth Protected]")), body: Center( child: RaisedButton( child: const Text("Logout"), onPressed: () { final Profile profile = Provider.of<Profile>(context, listen: false); profile.isAuthentificated = false; }, ), ), ); } } class MyLoginPage extends StatelessWidget { @override Widget build(BuildContext context) { return Scaffold( appBar: AppBar(title: const Text("Login")), body: Center( child: RaisedButton( child: const Text("Login"), onPressed: () { final Profile profile = Provider.of<Profile>(context, listen: false); profile.isAuthentificated = true; }, ), ), ); } }