生态指什么?

Flutter是跨端的应用开发框架,但Flutter本身专注于渲染,通过独立的Flutter渲染引擎,能够实现多端渲染完全一致。同时由于Flutter使用dart语言,dart语言又是一个兼容各个平台的语言,因此Flutter应用自动的获得了dart语言提供的诸多能力,包括由dart线程池支持的异步文件IO API、Isolate线程、TreeShaking无用代码自动裁剪,等等。
但是,除此之外的能力,Flutter并没有在核心框架中直接提供。这些能力主要是指需要依赖各个端独有API的能力。这其中,大部分能力在不同端都有提供,只是API不一样,能够被抽象为统一的API,少部分能力是某个端独有的,在没有该能力的端上无法使用。

这里的flutter生态,就是指flutter对于这些非flutter核心能力的支持程度,是否每一个原生端的需求都能够在不必自行编写端上适配代码的前提下,通过引入现有的flutter依赖顺利完成。

支持的能力

相机

相机能力,就是创建一个相机实例,并将实例同SurfaceTexture,也就是一个GL纹理绑定,相机实例负责将图像不断的上传到纹理。flutter底层是直接使用GL API的,知道如何绘制GL纹理,因此只要在端上创建好相机实例,绑定好Surface,然后将Surface句柄交给flutter,flutter即可将纹理像一个widget那样显示出来。

运行时权限

https://pub.dev/packages/permission_handler

不支持的能力

Android Activity状态恢复

https://github.com/flutter/flutter/issues/6827
这个问题自从Android系统出现就一直困扰着无数Single Page Application,Flutter也是运行在单个Activity的框架,因此Flutter也开始受到这个问题的困扰。
这个Issue已经开了三年半了,至今依然开着,毫不意外。毕竟,国内的各个大厂做出来的App,凡是Single Activity的架构的,也都有这个问题。
要规避这个问题,或者说最小化这个问题带给用户的困扰,就是:不要离开App页面!!一旦离开了App页面,系统就可能由于资源不足,或者为了省电(华为)而随时杀掉应用进程,同时在系统服务中保留页面栈记录,下次返回到App时还会从上次被杀时的Activity启动,但此时应用状态已经彻底丢失了,而且因为整个应用的界面都存在于单个的Activity中,要想完整的保存并恢复是非常、非常困难的。
一般来说,只要我们自己实现了相机、相册,就不太会需要跳转其他App。在不得不跳转的情况下,如果设计上用户是临时跳转出去完成某些工作再回来的,可以使用保活方案,如临时启动一个前台Service,来提高应用的优先级,尽可能避免被杀死;如果设计上用户跳转出去后不需要返回应用,那就不用管了,回来时该活活,该死死,对用户的体验影响不大。

网络库能力不够完善

dart的http网络库提供的接口过于简单和有限,比较令人无法接受的就是不支持磁盘缓存。包括Flutter的Image widget也只实现了内存缓存,要想将图片缓存在磁盘,必须使用其他的flutter库:cached_network_image。

flutter扩展

如何开发、调试package

如何依赖本地正在开发还没发布的package:https://flutter.dev/docs/development/packages-and-plugins/using-packages#dependencies-on-unpublished-packages
如何开发package:https://flutter.dev/docs/development/packages-and-plugins/developing-packages

Plugin扩展

https://flutter.dev/docs/development/platform-integration/platform-channels

dart端

MethodChannel允许flutter dart代码向端上发送消息,让端上调用方法。双端各自有MethodChannel对应的类型,Android上是MethodChannelAndroid,通过这个接口就可以接收dart发来的消息以及可以给dart回发消息。
利用quick_actions plugin,也可以反过来,由端上调用dart方法,然后接收dart的结果。

MethodChannel中的消息是二进制编码的,能够通过MethodChannel传递的消息都是可以用简单的Json编码的消息,也就是所有基础类型、数组、以及字典。

将原生View作为Widget嵌入Flutter

Android Platform View

这块内容有点多,单独整理。
https://www.yuque.com/gaolf/ipvf6y/zlak8l/edit
根据wiki来看,虽然flutter是先支持的Android PlatformView,但iOS也是支持Platform View的,而且由于双端实现方案不一样,iOS直接将原生View添加到原生的View层次来渲染,而Android的方案则非常hack,因此iOS端问题比Android要少。

国内现状

国内几乎能找到的所有关于flutter的资料都是出自闲鱼的,而闲鱼的重心又在实现一套和flutter API不相容的混合页面栈,甚至是要实现一套web on flutter容器,在业务无感知的前提下替换掉容器来支撑Weex、H5甚至小程序业务,和Google对于flutter的设计方向不是一个方向。

从flutter目前的API来看,核心场景应该还是flutter作为独立App框架,或者flutter作为独立App模块的场景,flutter和原生业务耦合互跳并不在Google考虑之中,文档明确指出目前经过验证的场景只有单flutter view场景,创建多个flutter engine理论上是没问题的但官方并不保证可用性,混合栈这块没有官方制定的标准的方法。闲鱼开源了他们自创的方案:https://github.com/alibaba/flutter_boost,但是由于不是官方提供的,因此必然是会比官方版本慢一段时间,另外闲鱼也可能有人员变动,开源项目是否一直有人维护也是个问题。