写点什么

聊聊 FlutterEngage 大会中的特性落地

  • 2021-04-26
  • 本文字数:4143 字

    阅读完需:约 14 分钟

聊聊FlutterEngage大会中的特性落地

flutter engage 大会已经过去一段时间,闲鱼团队作为国内较早大规模使用 flutter 的团队,对 flutter 的每一次升级都感到兴奋无比,网上已经有很多介绍大会的 flutte 2 特性的介绍文章,就不会赘述具体特性,今天会从开发者的角度如何看待以及评论这些新特性,评估这些特性在业务场景应用,最后对 flutter 未来的展望,将来还有哪些值得期待的功能。

Flutter2 新特性

全面支持 Windows、MacOS、Linux、Web、iOS、Android 六大平台

本次 flutter engage 大会最大的亮点莫过于支持更多平台,在原有移动端的基础上,新增桌面、web 端,从此 flutter 往真正的多平台迈向了更加坚实的一步,flutter2 看起来更像全新的引擎。


null

桌面平台

flutter2 全面支持目前主流的 Windows、MacOS、Linux 桌面平台,其实对于 fluttre 架构而言,因底层使用 skia 本身就跨多平台的缘故,从移动端扩展到桌面端是非常顺畅。


优点

开发者编写一份 Dart 渲染代码,便可以部署到多个平台,是一个非常流畅的开发方式。


目前存在的问题

除了编写 Dart 渲染代码外,还需要关注工程所依赖的库是否都完美的支持了桌面版平台。谷歌声称其官方维护所有 pub 库已经全部支持 web/macos/windows 等平台,除此外社区其他的库还需要等待作者们升级,要想流畅升级的开发者们可能还需要尚待时日。


想要迁移至桌面平台的开发者们可以自行评估自己的工程所依赖的库。如果依赖的库大部分来自谷歌官方,且都支持了桌面平台,较少平台相关库,升级过程应该是非常顺畅的。


闲鱼观点

相比于业内其他成熟的跨平台桌面开发框架,学习成本比 Qt 偏小(Dart 语言),性能比 electron 好,但现成的组件没有 electron 成熟,非常适合工具类的应用从移动端平滑的迁移到桌面端。

Flutter web

flutter web 最开始的设计思路时使用 Dart 代码操作 css 或者 Dom 接口进行渲染,而到 flutter2 后已升级为 framework 和渲染层完全隔离,使用同一份 Dart 代码可以编译成多个平台。下面两图是基于操作系统的 flutter 架构和基于浏览器的 flutter 架构。


null

Windows/MacOS/Linux/iOS/Android 架构

null

web 架构

Flutter web 推荐场景

相同一份 Dart 代码如今能跑在各种平台下了,部署到服务器上也能跑在 web 端了,那么在上面常见下使用 flutter web 是最合适的呢?


谷歌推荐使用 flutter web 的场景有

  • Progressive Web Apps(PWA)

  • Single Page Apps(SPA)

  • 现有 app 迁移


PWA 和 SPA 是相对于传统 web 应用而言,传统 web 网页遵循请求-应答协议,网页内容的刷新和加载伴随着多次的网络请求。而 PWA 和 SPA 相对则会请求少,或者请求时回包的数据。比如 PWA,可以简单理解为这是一种期望运行在各种设备,接近 Native 应用保持一致体验的使用 web 应用。简单而言这是在用 web 技术模拟原生应用,这个应用渲染大部分代码无需网络请求,即开即用,可以无网络时离线运行,和普通原生功能一致,只是这是使用 web 技术编写,运行在浏览器的应用。常见的例子是安装在 android 设备的 web twitter 应用。


而 SPA 和 PWA 界限在于,SPA 的界面代码第一次需要网络请求,而后每次的请求都是纯数据的请求。

null

PWA 应用原理


null


SPA 应用原理

这三种场景使用 flutter web 的初衷是充分利用它相比传统 web 网页优越的渲染性能。如果使用 flutter web 来编写非常经典的 web 应用则既失去了利用 flutter web 优越渲染性能,又没法和传统 web 一样充分利用其成熟的生态。

如何迁移 Flutter web?

无需配置特别的设置,直接使用 IDE(VSCode 或者 Android Studio)编写 flutter 工程后,使用flutter build web即可体验。


但有以下几点需要重点关注:

  1. 依赖的 Flutter plugin 需支持 web 对于跨平台的 plugin,需要重新支持 web

  2. 响应式布局 相对于原有移动设备屏幕小,web 端可能会运行在各种屏幕下,各种交互方式需要进行优化。

  3. 页面跳转/导航 页面的跳转从移动设备的单窗口,变成浏览器下的多窗口,多 tab

  4. 桌面设备交互风格(鼠标、键盘) 支持浏览器下更加常用的鼠标键盘等的交互方式

  5. 渲染模式(HTML/CanvasKit) 需要根据业务需求选择 flutter web 的渲染方式(HTML 渲染方式安装包小,性能较差,CanvasKit 渲染方式安装包大,性能好)


目前存在的问题

因为浏览器的特性存在决定了,如要对一些于操作系统强相关的 plugin 库进行 web 的特性支持时,会存在困难,比如文件系统,各种社交媒体登录分享 sdk 等。因此进一步缩小了其使用的场景。


闲鱼观点:

flutter web 的渲染性能虽不如基于操作系统架构的原生 flutter 应用,但优于能部署在服务器,但又比一般的 web 渲染性能稍好,所以非常适合对性能在有要求的 web 活动业务场景中使用。或作为原生 flutter 界面崩溃时的一种业务降级兜底方案,在紧急场景业务充当救火队员的角色。


支持多屏设备

这是微软为将自家设备 surface duo 设备,开辟一个独立的分支给 flutter 支持多屏特性。


null


支持的特性能很好的支持多屏设备的特点,比如:

  1. Extended Canvas: 双屏共享一个大 canvas

  2. List-Detail: 左列表,右详情

  3. Two Page:多页,看书应用

  4. Dual View:双屏,相同内容不同角度的双屏

  5. Companion Pane:左显示,右配置


代码样例:


比如 TwoPanel 是新增的 Widget,panel1、panel2 传入两个不同屏幕的 widget

Widget build(BuildContext context) {   return TwoPane(      pane1: _widgetA(),      pane2: _widgetB(),      paneProportion: 0.3,      panePriority: MediaQuery.of(context).size.width > 500 ? TwoPanePriority.both : TwoPanePriority.pane1,   );}
复制代码


null


但目前这个分支由微软维护,暂未合入到 flutter 的主分支中 flutter github 中开辟的两个 issue 在专门跟进 (issue77156[1] ,issue24756[2]) ,感兴趣的可以去到下方链接了解概况 https://devblogs.microsoft.com/surface-duo/flutter-dual-screen-foldable/ [3]

Dart 语言新特性

flutter2 中除了新增平台等新特性外,配套的 Dart 语言也推出新特性


Sound null safety

Sound null safety 我们暂且称为空安全声明,目的是通过显式声明可能为 null 的变量,增加 Dart 语言的鲁棒性。因为 Dart 语言变量可以存 null 或者具体的值,因此在日常的开发中可能因为忘记赋值或者变量延迟赋值,导致访问某个变量时为 null,导致程序运行时抛出 exception。这个功能推出后,可以从源码级解决 null 异常导致的错误。简单的操作是在类型声明后添加?以标识这个变量是可以为 null 的。


null


如何迁移?为 Dart 了这个语法糖,对于已有的项目如何升级?谷歌对此也提供了配套的升级工具,只需要在工程目录下使用 dart migrate,就可以帮助你扫描整个工程中潜在的待替换的变量


null


优点

缓解因变量为 null 而抛出 exception 而引发的白屏,用户无法操作等体验问题。


目前存在的问题

但是开发者对于现存工程,一旦 Dart 代码一下子全部改造,无疑会增加系统风险,而且对于测试范围也会是非常繁重的任务。


闲鱼观点:

这个特性很好的将风险提前暴露在了编码阶段,又能顺带解决神出鬼没的 null 问题,性价比很高。但大规模改造也会引来问题,但这个特性非强制性的原因,为解决大规模改造可能导致的系统性风险,可以采取分批改造的方法进行。

FFI(Foreign Function Interface)

动态库函数调用特性。特性的目的是让开发者更加方便的调用操作系统的动态库。这个特性其实很早就已经有了,如今正式转正 stable,开发者们可以放心使用了。


使用的方式也非常直观

  1. 编译某个平台下的动态库

  2. Dart 代码中加载动态库,将 Dart 的函数和动态库的函数绑定

  3. Dart 调用已绑好的函数即可


null


FFI 更多详细看这里https://pub.dev/packages/ffigen


优点

由静态库迁移到动态库后,可以减少安装包大小

相比于注入 plugin 模式去调用操作系统的接口,FFI 更加友好,真正的按需加载,建议对于不常用频次少的的系统调用可使用 FFI,对于优化整个 engine 初始化的加载速度有很好益处。


闲鱼观点:相对于旧的 platform channel 这种与 C 交互而言,FFI 因需要动态库加载和符号绑定,性能不占优势,开发者们在选择这两种技术方案时是要权衡的。

社区其他

混合栈的跳转有官方支持了吗?


对于众多团队而言,最初都是由原生的应用引入 flutter,所以如何在原生界面和 flutter 界面跳转变成开发者非常强需求的功能点,flutter boost 的推出是为解决混合栈界面跳转而提出的解决方案,但该方案也并非完美,最大问题在于多个 flutter 界面跳转时需要多开 engine,无法共享 engine 中相同内存。针对这个问题 flutter2 中已经支持了 engine 多实例[4],但官方也说了,这是一个正式实验中有风险的功能,但官方未提供不同技术栈之间的跳转方案(iOS/Android->flutter,flutter->iOS/Android),但在官方对于这个问题的技术路线图中也说到,以后这个特性是需要需要继续开发的,但目前还是建议使用 futter boost 方案。


多 flutter 界面技术路线:https://docs.google.com/document/d/1fdKRufqUzQvERcqNIUSq-GdabXc4k8VIsClzRElJ6KY/edit#

细枝末节

除了以上的一些比较大的功能点外,还有一些提升效率小工具

  • flutter fix[5]:dart 代码分析工具,能高亮废弃代码等

  • dartPad2.0[6]: 浏览器运行 flutter 小工程,所见即所得,验证小问题神器

  • FFI Gen[7]FFI Dart 代码生成器,根据 C 接口批量生产 FFI 的 Dart 接口

展望

从作为开发者的角度而言,flutter2 扩展了更多的平台,让它在跨平台的路上越走越远。但与此同时,众多平台推出的同时,也会带来更多细枝末节的小问题,小 issues,同时从官方的下一步的动作看,接下来将会聚集在支持一个社区中响应度比较大的好几个问题中


  • 为解决混合栈中内存过大而开发的多引擎实例特性

  • 为解决开发时出现的性能 UI 调试难的问题,在着力开发 devtools 工具

  • dart 语言因缺少命名空间,正在开发的类似特性等等


这些问题我们也在持续跟进中,如有进一步的进展,我们也会和大家持续的探讨。更多 flutter 相关技术热点,欢迎大家持续关注闲鱼技术。

References

[1]issue77156: https://github.com/flutter/flutter/pull/77156

[2] issue24756: https://github.com/flutter/engine/pull/24756

[3]https://devblogs.microsoft.com/surface-duo/flutter-dual-screen-foldable/https://devblogs.microsoft.com/surface-duo/flutter-dual-screen-foldable/

[4]engine 多实例: https://flutter.dev/docs/development/add-to-app/multiple-flutters

[5]flutter fix: https://flutter.dev/docs/development/tools/flutter-fix

[6]dartPad2.0: https://dartpad.dev/flutter

[7]FFI Gen: https://pub.dev/packages/ffigen


本文转载自:闲鱼技术(ID:XYtech_Alibaba)

原文链接:聊聊FlutterEngage大会中的特性落地

2021-04-26 14:002291

评论

发布
暂无评论
发现更多内容

C++语言中std::array的神奇用法总结,你需要知道!

华为云开发者联盟

容器 数组 函数

「面试必备」最新整理出的腾讯C++后台开发面试笔记

linux大本营

c++ Linux 后台开发 架构师

使用resilio实现多集群的k8s pod数据双向非实时同步

东风微鸣

Kubernetes 探索与实践 openshift

产业新基建,撬动数字经济发展新机遇

京东科技开发者

人工智能 新基建 京东

一点就透的二分查找算法

比伯

Java 编程 程序员 面试 计算机

身为程序员还记得C语言经典算法(附带答案)吗?

ShenDu_Linux

c c++ 算法 编程语言

架构师训练营第 1 期第 10 周总结

owl

极客大学架构师训练营

CAP理论

DL

接口测试如何在json中引用mock变量

测试人生路

json 接口测试 Mock

一线大厂欺负程序员?京东单方面辞退38岁P7员工三次败诉

Java架构师迁哥

深度剖析,为何C语言在开发领域的地位如此稳固

Philips

Python .net rust C语言 Go 语言

Mysql数据备份与恢复

张攀钦

MySQL

Mac下Docker Desktop配置阿里云镜像加速器

jiangling500

Docker 阿里云镜像加速器

Kubernetes初体验--用Kubernetes部署一个Web服务

网管

Kubernetes k8s Web 服务 Go 语言

使用 Jira Service Management 管理资产,您需要知道的5件事

Atlassian

数字化转型 Atlassian Jira ITSM ITIL

不懂源码?来看看阿里P8亲自手码的Spring源码解析整套笔记,高薪offer唾手可得!

比伯

Java 编程 架构 面试 计算机

《我想进大厂》之Spring夺命连环10问

艾小仙

Java spring 程序员 面试 大厂

架构师第一期作业(第 11 周)

Cheer

作业

源码 | 浅谈Webpack原理,以及loader和plugin实现。

梁龙先森

大前端 webpack

Linux 笔记(三): 软件安装

Leo

Linux 学习 大前端

Canal 组件简介与 vivo 帐号实践

vivo互联网技术

数据库 分布式 数据存储

薇娅携手中国航天基金会与我们的太空 带你“益起探月,共舞九天“

什么是低代码(Low-Code)?

阿里巴巴云原生

程序员 云原生 代码

第十周课后练习

饭桶

架构师训练营第十周作业

文智

极客大学架构师训练营

揭秘11.11监控排障利器 京东高稳定日志服务深度解析

京东科技开发者

云计算 DevOps 日志监控

Spring Boot 2.4.0正式发布,全新的配置文件加载机制(不向下兼容)

YourBatman

云原生 Spring Boot 新特性

“摸爬滚打”多年,从月薪3K到30Kjava大神,我是怎么蜕变的?

比伯

Java 编程 架构 面试 计算机

第十周学习总结

饭桶

什么是物联网?常见IoT 物联网协议最全讲解

华章IT

物联网 IoT

排查指南 | mPaaS 小程序提示“网络不给力”时该如何排查?

蚂蚁集团移动开发平台 mPaaS

小程序 网络 小程序生态 mPaaS

聊聊FlutterEngage大会中的特性落地_大前端_闲鱼技术_InfoQ精选文章