需求:
· 在我的界面,展示了用戶(hù)信息姓名笔刹、年齡囱持、性別等信息
· 我的界面有一個(gè)設(shè)置按鈕,可以修改這些用戶(hù)信息
· 修改之后怎么刷新呢闲擦?
· 這時(shí)候就使用到全局狀態(tài)管理
dependencies:
flutter:
sdk: flutter
flutter_redux: ^0.5.2 #全局狀態(tài)管理機(jī)
eg:
// 再添加其他的全局類(lèi)慢味,都在初始化store時(shí)候添加進(jìn)去
// YYRedux.dart
import 'package:ly_app/Model/UserInfo.dart'; // UserInfo類(lèi)
import 'package:ly_app/Redux/UserInfoRedux.dart'; //UserInfoRedux類(lèi)
// 需要全局的對(duì)象在YYState類(lèi)里面添加
class YYState {
UserInfo userInfo;
YYState({this.userInfo});
}
// 創(chuàng)建store使用
YYState appReducer(YYState state, action) {
return YYState(
// 將全局對(duì)象和action關(guān)聯(lián)
userInfo: UserInfoReducer(state.userInfo, action),
);
}
// UserInfoReducer.dart
import 'package:ly_app/Model/UserInfo.dart';
import 'package:redux/redux.dart'; // redux全局狀態(tài)管理
/// redux 的 combineReducers, 通過(guò) TypedReducer 將 UpdateUserInfoAction 與 reducers 關(guān)聯(lián)起來(lái)
final UserInfoReducer = combineReducers<UserInfo>([
TypedReducer<UserInfo, UpdateUserInfoAction>(_updateLoaded),
]);
/// 如果有 UpdateUserAction 發(fā)起一個(gè)請(qǐng)求時(shí)
/// 就會(huì)調(diào)用到 _updateLoaded
/// _updateLoaded 這里接受一個(gè)新的userInfo,并返回
/// 更新全局對(duì)象時(shí)候調(diào)用的方法
UserInfo _updateLoaded(UserInfo userInfo, action) {
userInfo = action.userInfo;
return userInfo;
}
class UpdateUserInfoAction {
final UserInfo userInfo;
UpdateUserInfoAction(this.userInfo);
}
// main.dart
import 'package:flutter/material.dart';
import 'package:flutter/cupertino.dart';
import 'package:ly_app/MainPage.dart';
import 'package:ly_app/Model/UserInfo.dart';
import 'package:redux/redux.dart';
import 'package:flutter_redux/flutter_redux.dart';
import 'package:ly_app/Redux/YYRedux.dart';
void main() {
runApp(
new Rooter()
);
}
class Rooter extends StatelessWidget {
/// 在app入口 初始化全局狀態(tài)管理對(duì)象store
/// StoreProvider 接收對(duì)象store
final store = new Store<YYState>(appReducer, initialState: new YYState(userInfo: UserInfo.empty()));
Rooter({Key key}) : super(key : key);
@override
Widget build(BuildContext context) {
return new StoreProvider(
store: store,
child: new StoreBuilder<YYState>(builder: (context, store) {
return new MainPage();
}
)
);
}
}
訪問(wèn)數(shù)據(jù)?
StoreProvider.of(context).state.userInfo;
更新數(shù)據(jù)?
StoreProvider.of(context).dispatch(new UpdateUserInfoAction(newUserInfo));
/// 在需要更新或者獲取全局狀態(tài)時(shí)候需要獲取到store ?
Store<YYState> _getStore() {
if (context == null) {
print("YYState null");
return null;
}
return StoreProvider.of(context);
}
/// 點(diǎn)擊事件 更新全局狀態(tài) 1墅冷、創(chuàng)建對(duì)象 2纯路、調(diào)用更新方法?
onPressed: () {
var map={"name":"更愛(ài)","id":2};
UserInfo newUserInfo = UserInfo.fromJson(map);
_getStore()?.dispatch(new UpdateUserInfoAction(newUserInfo));
}
/// 哪里需要使用全局狀態(tài),就在最外面new StoreBuilder?
@override
Widget build(BuildContext context) {
return new StoreBuilder<YYState>(builder: (context, store) {
return new Text(_getStore().state.userInfo.name)
});
Flutter完整開(kāi)發(fā)實(shí)戰(zhàn)詳解
Dio網(wǎng)絡(luò)請(qǐng)求
UI界面