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