带你重新“玩转”Flutter( 二 )


•提供Stream:当你要进阶学习Flutter的时候,很多地方能见到它 。它能做流式数据处理,函数组合,传输控制,属于进阶必知必会 。
•mixin特性:这是很有用的特性,尤其在架构设计方面 。它提供了新的组合方式,在做功能组合的时候,Dart可以使用对象注入,或者高阶函数,或者mixin 。
 
Dart-Runtime / VM当你引入Flutter,你就有一个Dart-Runtime啦 。当然,它本来的意义是支持Flutter运行的,然而就像JS的V8引擎一样,本来是用来支持H5页面的,后面的脑洞就越开越大了 。当然Dart没有JS的动态能力(特殊的场合也可以),但它是跨端的,而且aot性能有保障,发掘空间较大,还能同时覆盖几乎所有场景,手机App开发,PC的构建部署,服务端,甚至serverless运行时 。
 
Flutter应用开发框架Flutter带来了高性能的跨平台GUI Framework,这没啥可说的,用就是了!但如果已经有了自己的开发生态,舍弃成本太大,又想“借用”下Flutter的技术优势,大概有几种方案:
•语言转换,基本上就是把其他语言的布局结果交给Flutter Framework 。
•中层Framework介入,选择一棵树介入,这样对接面会小一些 。
•底层Framework替换,整个替换掉Flutter Framework, 直接使用底层的Engine 。

带你重新“玩转”Flutter

文章插图
当然,还有一种方式就是混合开发了,需要实现混合栈管理,而且在1.22版本以后,Flutter升级了Navigator组件,提供了Navigator 2.0,这对混合开发是一个利好 。
 
开发构建工具值得一提的是HotReload,谁用谁知道 。热部署不仅界面开发需要,这是个通用需求,如果在服务端通过Dart实现一个,也是极好的 。
Flutter的构建工具并无太多亮点,而且因为Dart语言在Flutter中不支持反射(产物太大,增加包体积),业务架构实现上很多需要依赖于编译时处理的技术,这对构建系统的能力有较大依赖的 。换一个角度,因为这一领域尚没有成熟方案,加上Dart的工程“友好”,可能实现由一种语言来统一前端开发,后端开发,以及构建和部署,真做到了会很酷!
 
Flutter可以有些啥玩法讨论前端要解决的几个基础要素问题,也讨论了Flutter带来的技术工具,结合这两点,看看利用Flutter都能做些啥 。
 
远端通信“远端通信”是一个做了抽象的概念,具体形式会根据“节点”的定义不同而不同 。可以是指物理设备之间的通信(手机与服务器),也可以指模块之间(页面与另一个页面)的通信,还可以指组件之间(两个StatefulWidget之间)的通信 。因为在Flutter中“一切皆是Widget”,所以简化的看,Flutter里面大概分为两种情形:面向服务器的通信和组件(Widget)之间的通信 。
•面向服务器的通信:这方面有传统的Restful,GraphQL,还有兴起于“云原生”概念的Serverless 。借助于Dart的能力延伸,Dart-Runtime可以成为Serverless的可选容器,那么前后两端都可以使用Dart来开发,如果再用Dart补足中间的构建部署pipeline,那么可以搭建出一个很“云原生”概念的应用程序开发流(dev flow):
带你重新“玩转”Flutter

文章插图
Flutter的跨端能力结合云原生的弹性部署,前后端的实现可以放到一起,它们之间的调用也变得简单自然,有理由相信这会是一个高效的开发方式 。闲鱼已经做了前期的探索,并在业务中尝试落地 。
此外,GraphQL与Flutter也是值得尝试的组合,GraphQL和React范式在理念上很对味口,但是我们并没有尝试过 。
•组件之间的通信:Flutter提供的基础业务编程组件是StatefulWidget和StatelessWidget,它们是按树形结构来组织的,并提供了InheritedWidget来支持它们之间的通信,在通信方式可以总结出3种:
    • Notify型:通知/监听模式,Flutter提供了ValueNotifier和ChangeNotifier, 简单方便,适用于轻量信息通信,参见Provider
    • Invoke型:接口调用模式,类似轻量RPC方式,在Flutter的应用架构设计中竟然很少见到 。它确实有些重,但是有前面的模式没有的优势:它是双向的 。
    • Transmission型:数据传输模式,Dart提供了Stream来支持这种模式 。使用灵活,扩展方便,几乎是框架设计必备,参见BLoC 。

带你重新“玩转”Flutter

文章插图
 
状态管理状态管理是个大问题,它由两个元素构成:状态和处理状态的逻辑 。在代码实现上,状态就是数据,逻辑就是函数 。当它们变得复杂的时候,解决的办法其实就是拆分,然后再合理的组合 。我尝试从状态和逻辑的拆分选择上来列举所有可能的解法:


推荐阅读