初识 Flutter
一些在 Flutter 学习中的初步了解及思考,本文思路比较发散,不设置标题了。
现在的跨平台其实也分两类或者三类,一类是在移动端跨平台,包括 android、iOS、小程序、webapp 这些;第二类是在桌面端跨平台,包括 macos、windows、Linux;第三类就是前两类的交叉项。当研发需要选择一个跨平台框架,首要的肯定是根据自身需求出发,这里主要考虑桌面端的跨平台需求,而且主要是 macOS 和 windows。(未来或许也可以考虑加上移动端)。桌面跨平台框架主要是 Electron 、 Tauri 、Flutter、React Native 、QT,前两个都是使用 web 技术实现,Flutter 是使用自渲染实现,QT 没有深入了解,这个得用 c++ 开发。Flutter 是性能最好的一位,一方面是渲染采用 skia 自绘框架,另一方面是语言使用 dart 语言,在编译执行上效率更高。
Flutter 中主打的是一切基于 widget ,widget 依据数据构建而成,如果有是需要有视图变更的需要,避免直接操作视图,而是通过修改数据来驱动视图变更。初看感觉这种 widget 嵌套写法有点“反人类”,但仔细想想 web 中的 html 其实也是嵌套,只不过会把 文档(Html)、样式(Css)、脚本(JavaScript) 分开写的,写习惯了 web 就感觉 Flutter 这种聚合的写法很臃肿,这还是属于不同开发方向的问题,如果是安卓开发人员估计就会感觉较为习惯 Flutter 一些了。
最近有在做一个 Flutter 中使用 webview 的 demo,虽然只是简单的组合插件的使用,但是也有遇到一些问题,比较直观的感受是 Flutter 对于布局的要求是比较严格的,遇到好几次因为布局造成的报错,类似高度溢出之类的,web 上会比较宽容,创建一个元素有无宽高或者宽高无限大都不会有问题,但是毕竟 Flutter 是端侧,严谨一点也是合理的。
至于为什么要去做这个 demo,因为我们是一个已有的 Electron 的项目,整体上来说应用的生命周期可以分为课前和课中两个阶段,阶段间相对独立且课前的业务比课中来说是比较轻的,所以考虑是否可以将课前切为 Flutter 加载来获取一些性能上的提升,理想一点可能是课前业务使用 Flutter 重写,课前作为单独的应用,和课中只做数据的交互就可以了。但是就现实来说,我们都不是熟练的 Flutter 开发者,整个重构的收益也是未可知,所以考虑分步来,比如先将某个页面转为 Flutter 原生写,再通过 webview 来加载其他的页面,这样既达到了部分 Flutter 化,又不会带来过高的开发成本。
实际(demo)开发中发现,Flutter 中对于 platform webview 的支持目前还是在于移动端,平台侧是没有的,那么只能是加载系统级的 webview 来使用,一些插件有做集成,但是多数都是只支持 Mac 或者只支持 windows 这样,两者都支持的又会有其他的缺点,在 pub.dev 上的 likes 数也比较低,整体上来看活跃的库偏少。做 demo 可以从简去使用单一平台的插件来展示效果,但是实际要实现的话,可能还需要魔改很多,尤其是这些开发还要涉及平台原生的开发,感觉上手难度更大。
参考文章: