什么是Flutter?
Flutter 是来自谷歌的一个出色的跨平台框架,可用来为移动、桌面和 Web 平台构建应用程序。
目前,Flutter在移动端的应用比较成熟,阿里的咸鱼、美团、头条等顶级互联网公司都有实践应用,虽然生态资源方面不如React Native,但发展势头非常迅猛,流畅的性能体验,以及苹果、安卓代码的一致性方面都令人印象深刻。
虽然Web端和桌面端的跨平台应用仍未达到生产环境下的使用,但还是相当值得期待的。
什么是redux?
通俗地说,redux可以理解为基于数据驱动交互界面的一种新的开发模式,特别适合Web端和移动端的应用开发。对于习惯于CS架构的开发人员来说,首次接触redux的概念特别不适应,CS下的界面控件赋值非常简单,给某个控件的属性赋值,界面就会立即做出相应的改变。如果使用redux修改界面的数据,则首先通过Reducer方法给数据池中的某个数据赋值,然后底层逻辑触发界面的刷新操作,从而使得界面的显示结果发生改变。
上图演示了redux的大致工作原理,图中并未使用redux的专业术语,方便初次接触的程序员更容易理解一些。根据上图,可以总结出关于redux开发的一些重要特征:
- 界面、数据与业务逻辑是分离的,这种分离在复杂的业务逻辑实现时,会带来很多好处:代码结构清晰、便于升级、便于维护、开发效率更高;
- 界面的显示方式、布局与内容是被数据驱动的,通过状态数据来控制界面改如何显示与布局,这意味着界面设计是动态的,非常灵活;
上图演示了同一个页面源码,在数据驱动下,其动态页面布局与显示的效果。
- 由于状态数据与内容数据都是可以保存的,那么记录每一个用户动作对应的数据视图后,完全可以通过数据回放的方式模拟用户操作的每一个动作,对代码调试与分析用户行为具有重大意义;
- 状态数据统一保存,可以避免多处保存时状态维护的混乱。
如果还有其它重要特性没有写出来,请大家指正啊!
什么是fish redux?
fish redux是阿里旗下闲鱼团队开源的一种redux框架,基本理念与其它状态管理框架大同小异,例如:scoped_model、provide、RxDart、Bloc等都是非常出色的状态管理框架。网上看资料说,fish redux特别适用于构建中大型的复杂应用,至于为什么不是很理解。尝试参考官方的示例程序,发现需要学习消化不少新的概念,尝试建立简单的应用逻辑后,感觉确实复杂,想过放弃,在学习他人使用provide框架过程中,发现实现逻辑虽然简单,但功能不够强大,似乎只支持全局数据池,不支持页面级别的数据池,在对列表数据项的渲染逻辑中,无法做到部分数据项内容或状态的局部刷新显示,我想这就是fish redux性能更加强大的体现之一吧。不得已,继续回到fish redux框架的学习中吧。
fish redux基本概念介绍
以下的一些基本概念是在开发《信息导航》APP过程中,逐步消化整理出来的,更加高级的概念由于没有使用机会,也未深入学习和了解。下述这些基本概念应该够用了。
上面两个截图分别展示了fish redux基本概念原理图以及对应的页面程序结构。下面分别介绍框架的一些基本概念:
- page state
page state用于保存页面内部的状态数据与内容数据,不作用于应用程序的全局,页面关闭,里面的数据也相应被销毁。对应上述截图中的“home_state.dart”文件。 - global state
global state用于保存应用程序全局的状态数据与内容数据,可以被所有的页面访问和修改,对应于"global_store/global_state.dart"文件。 - clone
为了提高数据刷新界面效率,原则上只有数据发生变化时才触发相应局部界面的刷新。那么如何判断保存数据的state对象发生变化了呢?使用oldState == newState基于对象地址是否发生变化进行快速判断,不必递归遍历对象的每个数据属性。当数据发生变化时,首先将原有的state对象clone一份(原始数据都复制一遍)为newState对象,将变化的数据赋值到新对象的相应数据属性中并返回,这就是一个reducer方法实现原理。如果数据没有变化,则只返回原始state对象,不会触发界面的刷新。clone方法在state中实现,因为state必须继承于Cloneable的泛型类。
@override
IntroState clone() {
return IntroState()
..checkValue = checkValue
..currentTheme = currentTh