Flutter版本玩Android客户端(7)——状态管理

  • 2019 年 10 月 4 日
  • 筆記

在上一篇文章Flutter版本玩Android客户端(6)——登录注册模块以及文章收藏与取消中完成了登录模块,但遗留的问题是未进行状态同步,导致left drawer的状态没有变化。本文继续完善该部分,效果如下:

状态管理

对于登录状态这个值,很多widget需要用到,属于全局状态,这里使用provider进行管理。 关于状态管理的更多知识,可以参考后面的文章。

提供初始化状态

在main入口处,根据sharedpreference中的状态进行初始化,Provider包括MyApp类。

void main() {    final _loginState = LoginState();      KvStores.get(KeyConst.LOGIN).then((isLogin) {      if (isLogin != null && isLogin) {        KvStores.get(KeyConst.USER_NAME).then((name) {          _loginState.login(name);        });      } else {        _loginState.logout();      }      runApp(Provider<LoginState>.value(        child: ChangeNotifierProvider.value(          value: _loginState,          child: MyApp(),        ),      ));    });  }  

获取登录状态

LeftDrawer中需要根据登录状态进行ui的切换以及跳转逻辑的控制,获取登录状态如下:

final _loginState = Provider.of<LoginState>(context);  

根据是否登录来控制用户名的显示,

Container(                    child: Column(                      mainAxisAlignment: MainAxisAlignment.center,                      children: <Widget>[                        FlutterLogo(                          size: 48,                        ),                        Padding(padding: EdgeInsets.all(8)),                        Text(                          _loginState.isLogin()                              ? _loginState.getUserName()                              : '未登录',                          style: TextStyle(color: Colors.white, fontSize: 12),                        )                      ],                    ),                  ),  

更新登录状态

通过

final _loginState = Provider.of<LoginState>(context);  

拿到LoginState后,像设置普通对象一样,那么需要使用该对象的地方将会自动同步。是不是很神奇?

关于代码,参考Github

插件

  • provider

参考

  • Flutter | 状态管理指南篇——Provider