前言
为什么有这篇文章?
这篇文章可以说是个人Flutter问题随笔吧,虽然Flutter可以方便的做到跨平台,但是毕竟是新项目,功能没那么全面也是意料之中,所以在此记录跟踪一下目前在使用Flutter过程中遇到的问题,目前的解决方案,并跟踪记录一下。
问题列表(持续更新):
- Flutter 中不支持异步测绘大量文字。
- ~Flutter IOS 后台音频播放~(已经有了第三方)。
- Flutter 中 NestedScrollView 中存在折叠头、子列表等情况下的滑动等异常。
- ~Hero 跳转之后的图片如果在折叠布局中被折叠隐藏了,那么Hero的退出动画无法正常播放,并且原图片无法显示~(flutter的master分支已修复,stable版本hotfix已发布)
- listView 不支持按index跳转
- Simulation的value会返回Infinite
- hintText不能垂直居中?
正文
1. Flutter 中不支持异步测绘大量文字
这个源自于个人练手APP,在开发阅读模块过程中遇到了这么一个问题:
如果想要自定义文字间距,段落间距等,那么自然就要使用textPainter自己绘制文字。但是由此引发出一个问题:如果有上万个文字,那么测绘时间会很长。自然会阻塞主进程。
解决这个问题,第一个想法自然就是使用异步处理,那么flutter 中的异步方案有哪些呢?
- Future(包括await async那些东西)
- isoloate
按照官方文档,大量计算东西应该放到Isolate中,所以,自然而然地,我们将textPinter测绘方法放到Isolate中执行,但是呢,执行报错:native function not found
原因就是UI包的类只允许在Flutter的UI Isolate中执行。
_此题无解,完结撒花,各回各家,各找各妈_(才怪)
解决方案一:Plugin
这个方法的思路来自于官方开发人员的回答:
right now you would have to write your own line-breaking logic - perhaps as a plugin. We don’t currently have any API for doing text layout in a separate isolate. @GaryQian might have some other idea about this too.
所以说,我们看下官方的Plugin是怎么实现的。
在 Plugin工程中,有这么一个: android_alarm_manager ,这个Plugin中的AlarmService.java文件中,有这么一个方法:startBackgroundIsolate(要素察觉+1)
通过阅读源码,我们得知,其实说白了就是新建一个FlutterNativeView ,这个FlutterNativeView 不负责渲染界面,只负责当后台线程来用。同样的道理,我们也可以用同样的方法来处理我们的需要运行在UI Isolate的异步任务。(至于为什么新建一个FlutterNativeView ,就能实现这个需求,粗略的说下是因为,每次新建FlutterNativeView,其实都会新建一些TaskRunner,其中就包含UI 的TaskRunner,总之有兴趣的可以搜下Flutter中的TaskRunner机制了解下)
不过,其实不用自己实现注册,有这么一个第三方:flutter_isolate可以做到这点,用法跟普通的isolate差不多&#x