Flutter跨平台初探
Flutter一路了解下来,令人欣喜又赞叹。它可以跨越6个平台,从桌面操作系统Windows、Linux、Mac OS,到Web开发,再到移动操作系统IOS、Android。跨越的广度,前所未有。这让人想起Java那句名言:"Write only once,Run anywhere"。在桌面操作系统上,Java基本实现了它的豪言壮语。但自从sun被oracle收购后,并没有再进一步。而Flutter似乎开启了新的跨平台纪元。虽然从目前来看,各种生态还有待发展,性能也有待提高,但前途星光灿烂,迸发着万丈光芒。本文将重点从Android平台的视角出发进行一些介绍。
(1)综述
Flutter使用Dart作为开发语言。Dart是一个现代的、静态编译的、面向对象的程序设计语言。语法风格和Java非常的相似,比Kotlin更像Java多了。但这里对它不再过多介绍。
Flutter其实是一个2D UI框架。在底层,它通过libflutter.so库来绘制界面。它并不使用Android 的View体系。Flutter的界面核心类是FlutterView,继承自SurfaceView,通过native的方式进行UI绘制。Flutter只使用一个FlutterActivity,并管理着所有的路由(页面)。触摸事件、手势处理、消息传递,都由Flutter自己管理。它不使用xml这种构建UI的方式,而是通过Dart语言来描述Widget树。它的国际化有很大的缺陷,官方目前推荐在代码中用static final字符串来处理,可以说是一种非常糟糕的方式。也听说有第三方dart库可以解决这个问题,但并未深入了解,这里就暂不多说。
(2)主要目录结构
Flutter Project可以通过flutter相关命令来创建,也可以通过AndroidStudio或者IDEA来创建。下面是它的主要目录:
- android:一个android Project主目录;
- ios:一个ios Project主目录,可以通过mac Xcode打开;
- linux:linux平台目录;
- macos:mac os平台目录;
- web:web平台目录;
- windows:windows平台目录;
- lib:跨平台的精髓,UI绘制、跨平台代码等都在这里。
lib下是跨平台的内容,其他各个目录是平台相关的内容。从lib这个名称可以看出,它是作为一个库被各个平台使用的。
(3)Flutter 插件
Flutter插件,是用来解决平台相关问题的一种方案。它是和平台紧密相关的库。在Android平台,插件的代码是由Java或者Kotlin编写的,最终会被打包进apk中。IOS平台也类似。某些和平台相关的功能,如果Flutter不能自己实现,也没有可用的插件,那么需要自己分平台实现。这会涉及到平台与Flutter的通信,它通过MethodChannel来支持。
(4)Flutter限制
Flutter跨越这么多的平台,有它的限制所在。以下是一些总结:
可以跨平台的:
- 2D UI,UI在主线程中更新的(通常都是,SurfaceView、TextureView例外) ;
- 网络请求、签名加密、Json序列化;
- 图片、文本资源的处理;
- 文件操作;
- 国际化,虽然很糟糕,但也算支持;
- 基本的动画,如平移、旋转、缩放、Alpha等;
- 屏幕相关及资源适配;
不能跨平台的,这里包括需要平台插件的,或者需要和平台相互通信处理的,如下:
- 跳转到其他App,从其他App跳入;
- Service、BroadcastReceiver、ContentProvider相关;
- 危险权限申请处理;
- WebView相关;
- JNI相关;
- 与JS的交互相关;
- 多媒体相关,如音乐播放、视频播放等;
- 系统服务相关,如震动、通知等;
- 数据库操作相关;
- 需要在子线程中更新UI的,如SurfaceView、TextureView,使用场景如地图展示等;
- 3D相关;
- 访问SD卡非本App对应目录;
如果有非常成熟的插件,其实也算可以跨平台。毕竟,不需要自己在各自平台加以实现,只需添加依赖项即可。这上面所列不能跨平台的,严格来说并不准确。但受时间精力所限,对各种插件了解不多,姑且这么列出来吧。如果没有插件可以使用,那么就需要自己编写可通信的平台代码。
(5)Flutter遗憾
要统一这么多的平台,自然并非易事。尤其是这些平台已经发展了很多年,相当的成熟,各方面在某种程度上都达到了极致。所以不可避免地,Flutter有一些遗憾,如下:
- 需要把Flutter各种库,如so库、插件库、dart库,放入最终的包中,使得App变得很大。一个仅仅展示HelloWorld的App,安装完后,要占据将近180M的空间;
- 任何一个使用Flutter开发的App,上面所列举的库,都被包含其中。如果安装20个,那么最少可能有180 * 20 M的空间被消耗,很多库都是重复的,并且重复20次。如果有更多App,占据的空间更大,重复次数更多。
- 性能问题。一个展示HelloWorld的App,冷启动的时间,Android 真机大概7-8s(7年前的机器,android系统7.0),IOS真机(iphone Xs max,最新系统16.0.2)大概5-6s。和原生App相比,差距实在太大了。这正是核心问题所在。而它又没办法避免,因为各种库需要被加载,尤其是flutter的so库(30M+)。
综上,在一些性能要求不高的场景,可以使用;对于性能要求高的,目前没法满足。
Over !
网友评论