+-
我为何最终确定使用flutter开发我的手机VoIP类APP

一年前我决定开发一款VoIP类的APP,之前我曾经使用过Java进行过Android APP的开发,也使用过ObjC进行过iPhone APP的开发,当然都是学习性质,开发出的APP也是Demo性质的,但基本上掌握了两个平台的开发技术。

由于之前从未听说过flutter,也未听说过RN等技术,所以一开始根本就没有考虑这些技术,但觉得再使用Java和ObjC进行新项目的开发,有点过时了。于是决定先学习swift,以便在新项目中改用swift进行开发。先进行IOS的开发,完了再考虑Android。

花了个把月学习swift,把教材通读了一遍,感觉swift确实是很好的语言,应该说是符合苹果公司出产精品的特征。然后尝试开始APP的开发,首先建立一个新的project,发现guide中多了一个SwiftUI的选择,不知道是什么东东,赶紧百度,如此这般,便知道了SwiftUI,也知道了声明式编程技术的先行者RN和flutter。于是赶紧又是一通狂学SwiftUI,感觉是和storyboard完全不同的编程技术,太好了,可以从晦涩难懂的storyboard中解脱出来。网上都说声明式UI编程如何的好如何的先进,那就好那就先进吧。但总感觉SwiftUI还处于初级阶段,玩具级别的水平,苹果公司仓促商用应该是感受到了RN和flutter的压力吧。

于是研究了一下RN和flutter,发现RN和flutter竟然能跨平台!一套代码就能在android和IOS两个平台上面跑,并且由于推出时间比SwiftUI长,功能和稳定性方便自然要超越SwiftUI。

于是思考再三,决定放弃Swift和SwiftUI!之前学习的Swift和SwiftUI算白学了,没办法,交学费啊。然后在RN和flutter之间选择,考察了方方面面,比如双方采用的技术、官方网站的精致度、官方文档的严谨性、全面性,果断选择flutter。flutter对国内开发者很友好,有专门的国内官方中文文档,并且点击中文文档的某段,会显示英文原文,这对于某些莫名其妙的翻译,查看英文原文带来很大的方便。

接下来,又花了个把月学习dart和flutter框架。发现dart语言和swift其实非常的相似,dart也已经推出了可选类型,称之为null-safety。dart的null-safety设计的其实比swift的可选类型更科学更易用。

由于我的项目是VoIP类的,有一个我自己采用C编写的编码库,在android下采用ndk编译成了.so,在IOS下编译成了一个静态库.a。还需要验证flutter对这个C语言库的调用能力。经过学习、尝试,终于成功在flutter上实现了对这个库的调用,在IOS和android平台上都测试OK,成功的进行了语音交互。需要说明的是,flutter对C语言库的调用是直接进行的,并不需要经由底层的IOS和android操作系统进行,也就是flutter-->C library --> IOS/Android。并且其调用过程比在swift和java上调用C库都要简单明了!随后我会写一篇文章,描述下我在测试futter对C库的调用过程中遇到的坑及解决方法。

还有在flutter上进行蓝牙操作、手机通讯录的读取,都完美解决。主要方法是在pub.dev找到相关的package,然后在上面修修改改,达到自己的目的。

然后还在flutter_dialpad这个package的基础上,实现我自己的拨号盘,效果完全模仿和我自己小米手机上的拨号盘,perfect。下面是APP原型的视频效果演示:
https://v.youku.com/v_show/id...

flutter的还有一个好处是完全开源的,意味着你可以一探到底,看看黑盒子里面究竟是什么东东,有些东西光凭文档,实在是弄不明白的,只有看源代码才能恍然大悟。

总结:flutter完全能满足我的VoIP类的APP的技术要求,真正实现了一套代码,在IOS和android只需要重新编译就能运行的效果。以前我要开发在IOS和android平台上都能运行的APP,要学习swift、kotlin(因为objc和java已经过时了),然后分别设计调试UI,想想都让人后怕。现在好了,flutter声明式的UI设计,让我在艺术家式的感觉中进行同时能跨IOS和android平台的设计。非常精彩的体验!