Flutter 是来自谷歌的一个出色的跨平台框架,可用来为移动、桌面和 Web 平台构建应用程序。
目前,Flutter在移动端的应用比较成熟,阿里的咸鱼、美团、头条等顶级互联网公司都有实践应用,虽然生态资源方面不如React Native,但发展势头非常迅猛,流畅的性能体验,以及苹果、安卓代码的一致性方面都令人印象深刻。
虽然Web端和桌面端的跨平台应用仍未达到生产环境下的使用,但还是相当值得期待的。
通俗地说,redux可以理解为基于数据驱动交互界面的一种新的开发模式,特别适合Web端和移动端的应用开发。对于习惯于CS架构的开发人员来说,首次接触redux的概念特别不适应,CS下的界面控件赋值非常简单,给某个控件的属性赋值,界面就会立即做出相应的改变。如果使用redux修改界面的数据,则首先通过Reducer方法给数据池中的某个数据赋值,然后底层逻辑触发界面的刷新操作,从而使得界面的显示结果发生改变。
上图演示了redux的大致工作原理,图中并未使用redux的专业术语,方便初次接触的程序员更容易理解一些。根据上图,可以总结出关于redux开发的一些重要特征:
如果还有其它重要特性没有写出来,请大家指正啊!
fish redux是阿里旗下闲鱼团队开源的一种redux框架,基本理念与其它状态管理框架大同小异,例如:scoped_model、provide、RxDart、Bloc等都是非常出色的状态管理框架。网上看资料说,fish redux特别适用于构建中大型的复杂应用,至于为什么不是很理解。尝试参考官方的示例程序,发现需要学习消化不少新的概念,尝试建立简单的应用逻辑后,感觉确实复杂,想过放弃,在学习他人使用provide框架过程中,发现实现逻辑虽然简单,但功能不够强大,似乎只支持全局数据池,不支持页面级别的数据池,在对列表数据项的渲染逻辑中,无法做到部分数据项内容或状态的局部刷新显示,我想这就是fish redux性能更加强大的体现之一吧。不得已,继续回到fish redux框架的学习中吧。
以下的一些基本概念是在开发《信息导航》APP过程中,逐步消化整理出来的,更加高级的概念由于没有使用机会,也未深入学习和了解。下述这些基本概念应该够用了。
上面两个截图分别展示了fish redux基本概念原理图以及对应的页面程序结构。下面分别介绍框架的一些基本概念:
@override
IntroState clone() {
return IntroState()
..checkValue = checkValue
..currentTheme = currentTheme
..userInfo = userInfo
..appConfig = appConfig
..searchMode = searchMode
..sourceType = sourceType
..contentType = contentType;
}
class IntroActionCreator {
static Action onStartupApp(bool checkValue) {
return Action(IntroActionEnum.onStartupApp, payload: checkValue);
}
static Action onPressUserContractLink() {
return Action(IntroActionEnum.onPressUserContractLink);
}
static Action onPressPrivateContractLink() {
return Action(IntroActionEnum.onPressPrivateContractLink);
}
}
Future _onRefreshPage(Action action, Context<InfoNavPageState> ctx) async {
GlobalStore.store.dispatch(GlobalReducerCreator.setErrorStatusReducer(false));
if (_isLoading(ctx.state)) return;
await _showInfoEntitiesBySourceType(ctx, action);
await _checkLatestMessage(ctx);
}
InfoNavPageState _setAutoSearchReducer(InfoNavPageState state, Action action) {
final autoSearch = action.payload;
if (autoSearch == state.autoSearch) return state;
final newState = state.clone()..autoSearch = autoSearch;
return newState;
}
Widget buildView(
InfoNavPageState state, Dispatch dispatch, ViewService viewService) {
var title = _getInfoNavTitle(state);
if (state.filterKeywords != null && state.filterKeywords != '') {
title = "组合条件:${state.filterKeywords}";
}
final searchMode = GlobalStore.searchMode;
final showShortIcon =
!searchMode && !state.hasParagraph() && !state.hasEntityKeyword();
return Scaffold(
appBar: AppBar(
automaticallyImplyLeading: false,
title: searchMode
? _buildInfoNavSearchBar(state, dispatch, viewService)
: _buildInfoNavTitle(state, title),
actions: [
_buildAppBarSearchIcon(state, dispatch, viewService),
showShortIcon
? _buildAppBarShortIcon(state, dispatch, viewService)
: SizedBox(),
],
),
body: Container(
alignment: Alignment.center, // 用于错误提示显示的居中
child: _buildInfoNavContent(state, dispatch, viewService)),
);
}
class HomePage extends Page<HomeState, Map<String, dynamic>> {
/// effect定义了当前页面的操作行为集合
/// reducer定义了当前页面的数据修改行为集合
HomePage()
: super(
initState: initState,
effect: buildEffect(),
reducer: buildReducer(),
view: buildView,
wrapper: keepAliveWrapper,
dependencies: Dependencies<HomeState>(
adapter: null, slots: <String, Dependent<HomeState>>{}),
middleware: <Middleware<HomeState>>[],
);
}
var params = <String, dynamic>{
ParamNames.lastTimeParam: state.lastPopTime,
ParamNames.keywordSwitchParam: state.iconQuarterTurns,
};
dispatch(HomeActionCreator.onProcessBackKey(params));
ctx.broadcast(InfoNavPageActionCreator.onToggleKeywordNav(true));
上述的基本概念请参照源码来逐步理解,如有问题请留言共同探讨。
后续文章将继续介绍《数据列表的状态管理实践》以及《APP开发过程中的性能优化理念》,敬请期待。
源码地址