目前跨端开发比较热门的就是 React Native
和 Flutter
了,到底该选哪门技术似乎也快成了大前端圈的一个热门话题。对于web前端来说,基于web生态的 React Native
应该是一个更加顺畅而自然的选择;但 Flutter
让人动心的地方就是高性能和 跨端UI一致性。而React Native
发展不太明朗和 Flutter
越发成熟的走势对比促使我从观望的心态转为加入 Flutter
。
这里主要就是记录一下学习Flutter
的一些感想和看法:
- 包管理
- 布局和样式
- json
- 状态管理
包管理
pubspec.yaml
文件的作用类似于 npm
的 package.json
,而yaml格式也比json方便。但是不能用命令行自动安装包却让习惯了npm的我觉得麻烦。因为Flutter 安装依赖包是这么一个流程:
- 打开pub.dev网站;
- 搜索需要的包,得到包的名称和版本;
- 把包名称和版本填入
pubspec.yaml
,最后才开始下载包。
我觉得应该直接命令行安装包,让它帮我们下载,名称版本自动写入pubspec.yaml
。如果没有指定版本就是默认下载最新版本,因为很多时候我们并不想知道版本号,给我个能用的最新的版本号就ok了。
布局和样式
就和很多人想的一样,为什么不使用 jsx 或者 xml 格式进行布局,因为基于代码的方式看起来太不直观了,之所以这样听说主要是能更方便的和Dart
的hot reload特性配合使用,代码改动能立刻反映布局变化。但我还是期待有适配转化 DSL
的框架出现。
Flutter
一切都是widget,但是连很多属性都当成widget 这就让人有些看不明白了,比如 Center
,Align
,Padding
,为什么不把常用的样式属性都加入到布局组件里面呢?这导致出现了这么一种情况:嵌套严重,一个很简单的功能需要层层嵌套才能实现,而且样式也不能方便的复用。目前比较合理的建议就是适当抽取出子组件减少嵌套。
Json
Dart
作为强类型的语言,一切皆是对象。Dart
要方便操作json
就得把json
转化为对象,这就意味着每用到一个json
,就需要定义一个对应的类,这也是强类型语言的通病了。这绝对让人很怀念 js/ts 这种对json操作非常自然顺畅的弱类型/函数式语言。当然也不是没有妥协的解决方案,比较方便的就是 json_model,Flutter实战作者写的一个工具库,步骤也简单:
- 在工程根目录下创建一个名为 "jsons" 的目录;
- 创建或拷贝Json文件到"jsons" 目录中 ;
- 运行
pub run json_model
(Dart VM工程)orflutter packages pub run json_model
(Flutter中) 命令生成Dart model类,生成的文件默认在"lib/models"目录下
状态管理
Flutter
使用initState
,setState
方法设置widget状态,原理类似React
。当然这只是widget内部控制状态用的,跨组件通信还是需要其他方案的。官方推荐是使用Provider
,使用下来中规中矩吧,当然还可以使用大名鼎鼎的 Redux
以及 mbox
。不过Redux
本身就以过多的样板代码而出名,写React
的时候就不喜欢用,hooks
出来后就果断就放弃Redux
了。hooks
才是真香啊,Flutter
什么时候才支持类似的函数式状态管理方案呢?
总结
说了这么多,本质就是为什么 Flutter
不向以 React
为代表的 web 生态看齐?更大的原因是Flutter
的很多理念和开发模式其实远远落后于 React 。这也是为什么习惯 react/vue
的 web前端 对于Flutter
感觉很别扭不顺手的原因了。