1、网络请求;
3、broadcast的使用;
broadcast的使用这个其实在前面的文章有用到,但是在这里特别介绍一下,感觉这个还是蛮有用的,因为我在最近做了一个app,这个用到的地方比较多,也比较方便,所以特别写一篇。
其实这个用起来也比较简单,但是有一个地方要特别注意,直接上代码:
var routes = new PageRoutes(
pages: <String, Page<Object, dynamic>>{
'home': HomePage(),
'main': MainPage(),
'index': IndexPage(),
'smart': SmartPage(),
'mine': MinePage(),
'indexTab': TabPage(),
'radioDetail': RadioDetailPage(), //电台详情页
},
visitor: (String path, Page<Object, dynamic> page) {
/// XXX
if (page.isTypeof<GlobalBaseState>()) {
page.connectExtraStore<GlobalState>(GlobalStore.store,
(Object pageState, GlobalState appState) {
final GlobalBaseState p = pageState;
if (p.appTheme != null && p.appTheme.dark == appState.appTheme.dark) {
print("path=$path");
return pageState;
} else {
if (pageState is Cloneable) {
print("Cloneable path=$path");
final Object copy = pageState.clone();
final GlobalBaseState newState = copy;
newState.appTheme = appState.appTheme;
return newState;
}
}
});
}
page.enhancer.append(
viewMiddleware: <ViewMiddleware<dynamic>>[safetyView<dynamic>()],
adapterMiddleware: <AdapterMiddleware<dynamic>>[safetyAdapter<dynamic>()],
effectMiddleware: [_pageAnalyticsMiddleware()],
middleware: <Middleware<dynamic>>[logMiddleware<dynamic>()],
);
},
);
就是你要发广播或者接收广播的地方一定要在这里注册,就是pages里面,用的时候这样用如mine页面我们就这样调用routes.buildPage('mine', null),
然后发广播就都在effect中发,如个人中心的effect:
Effect<MineState> buildEffect() {
return combineEffects(<Object, Effect<MineState>>{
MineAction.changeGridAction: _changeGridAction,
MineAction.changeThemeEffect: __changeThemeEffect,
});
}
void _changeGridAction(Action action, Context<MineState> ctx) {
SPUtils.save("gridOn", action.payload);
ctx.dispatch(MineActionCreator.changeGridValue(action.payload));
ctx.broadcast(MineActionCreator.changeGridValue(action.payload));
}
void __changeThemeEffect(Action action, Context<MineState> ctx) {
SPUtils.save("dark", action.payload);
ctx.broadcast(MineActionCreator.changeThemeAction(action.payload));
}
下面两个方法都是用广播形式了,我们只要在相应effect页面注册改广播就可以了,如下所示:
Effect<TabState> buildEffect() {
return combineEffects(<Object, Effect<TabState>>{
MineAction.changeGridValue: _onAction,
});
}
void _onAction(Action action, Context<TabState> ctx) {
print("fadsfadsfdfsdsfdfs");
ctx.dispatch(TabActionCreator.changeGridAction(action.payload));
}
这里是在TabPage页面的effect中注册changeGridValue的action,接收到后我们需要再发一个action才能改变当前的值,也就是发一个action个reducer修改值,如下所示:
Reducer<TabState> buildReducer() {
return asReducer(
<Object, Reducer<TabState>>{
TabAction.changeGridAction: _changeGridAction,
},
);
}
TabState _changeGridAction(TabState state, Action action) {
var payload = action.payload;
print("_changeGridAction-------------------$payload");
final TabState newState = state.clone()..gridOn = action.payload;
return newState;
}
ok,到这里就更新了页面,我们可以在前面文章的gif图中看到本来是listview的点一下 GridView显示的开关,首页那里就变成了gridview了。
传送门:demo