最近在使用Flutter来开发完全免费开放的E6开发平台对应的手机app客户端。
由于Flutter基于Dart语言开发,而Dart具有一个非常有趣的特性:Future,如果一个方法如果被定义为Future,意味着它可以被异步调用,这一特性对页面状态更新等操作非常必要。如果页面状态的变化和刷新是同步执行的,那将导致极为卡顿的用户体验。
这也就带来了一个非常有趣的现象:由于Future的调用链具有“传染性”,如果一个方法调用了其他的Future方法,那么这个方法也必须被定义为Future,哪怕在调用时使用了await也不行。所以这导致代码中充满了Future方法和await关键字。因为在实际使用中,我们往往需要等待其他方法返回结果后才能继续进行后续处理。
尤其在前后端交互的场景中,我们常常需要等待上一个读写操作完成后才能进行下一步操作,这就要求我们使用await或then,写起来确实让人感到不便。
也许是Flutter为了解决Future带来的一些调用的问题,又引入了另一些稀奇古怪的东西:
比如文件下载经常需要显示文件下载进度,假设我们需要等文件下载完成后再解析文件做处理的话(比如APP需要下下载E6开发平台的系统包,解析后才能动态生成页面,才能进入下一步),那还得做特殊处理,当然可以先下载完成后then一把再进入下一步,但是那就可能会出现then的层层嵌套,非常难看。所以Flutter又引入了一个Completer...,就是用来等待的。在其他语言中等待不就是很贱的的事情吗,等他执行完成就行...
当然吐槽不是目的,Flutter很优秀,页面构建的思想也非常好,语言风格和java,C#等主流语言非常类似,所以上手非常容易,整个书写页面代码的过程就是一个我们从上到下构建的过程,最关键一套代码跨IOS和android嘛!
以前我们开发E6开发平台的Web客户端的时候其实也考虑过类似的方案(通过类似的层层嵌套的方式再Render出来html代码,只不过后来评估觉得后面扩展性不好,所以采用了NVelocity模版引擎来动态生成页面了)。
下面的图片是根据E6开发平台动态生产的Flutter app,欢迎交流!