Dart和Flutter及其开发环境

去年关注到了 Flutter 这个来自 Google 的跨平台框架,上个月突然就发现 Flutter 火爆了,原来是阿里巴巴的闲鱼团队在他们的项目里混入了 Flutter,还分享了几篇文章,这无疑奠定了 Flutter 可以用于大型项目中的基础,毕竟闲鱼是有超千万用户级的体量.

Dart

Dart 和 Golang 一样也是来自 Google, 是在 2011 年发布的语言, 发布只比 Golang 晚了两年.前些年不温不火,混的实在是惨,但最近也是被 Flutter 带火了一把.

这就像当初 2009 年 Android 起来后,把半身入土的 Java 硬生生给送上了云端,并且最关键的一点就是根据 Flutter 的自我描述, 它将会是跨 Android / IOS / Windows / Linux / Mac 这五大平台的. 写一套代码的项目就能跑五个平台,激不激动,想不想哭?

Flutter

Flutter 前身叫做 Sky,亮相于 2015 年 5 月的 Dart 开发者大会上,后来在 2016 年底更名为 Flutter.

实际上在 Flutter 被编译后,即可以是一个独立的二进制可执行文件,也可以是基于 DartVM 的跨平台应用,一套代码编译一下就能四处浪,简直赞.而且在移动平台上,Flutter 秒级热重载让我感动,之前给公司调试安卓程序,编译一下要浪费二十多秒生命.这么快就是涉及到关于 Dart 编译的 AOT 与 JIT 模式. 快速热重载就是使用了 JIT 编译,而发布正式版时则用 AOT 模式编译,能加快 App 的响应速度,

但实际在我之前的体验中, 当 App 体量较大的情况下有时候会出现并没有卵用的情况,也就是说用 Flutter 热重载一个有上百个控件的情况下,有时候修改后的变化并不会体现.当然,这个bug无伤大雅,希望这个问题在正式版发布后能得到解决.

根据官方对 Flutter 的描述, Flutter 再往后会逐步兼容主流的桌面与移动平台,当前对桌面平台的构建可以参考官方的嵌入库:

其实关于 Google 强推 Flutter 与 Dart 我是有一个猜测:

早在 2010 年,Oracle 收购 Sun 公司不久后起诉 Google 的 Android 开发平台中使用了 OracleJDK 的9行代码,要赔偿 88 亿美元,结果都知道,今年 3 月底火爆 IT 圈的事情,就是谷歌败诉了,判定原因说是 Google 抄袭了近 11000 行 Oracle 的代码.
Oracle 这一手操作可以往前推到 Sun 与微软的那波事件,当年微软使用 Java 语言和 JDK 库搞了个 J++,却不兼容 JVM,微软这波骚操作直接让 Sun 惊呆了, 于是就被 Sun 告了. 微软当然不是那么容易妥协的,虽然赔了 16 亿美元给 Sun, 但却直接抛弃了 J++, 转头就搞了个 J# ,然后衍化成了现在大学里每个计算机专业都要认识一下的 C#.
有微软这前车之鉴在,我猜测 Google 也希望走这样一条路子.首先推一个语言,然后再推一套跨平台开发的解决方案,慢慢的让使用的开发群体壮大起来,让往后发布的 Android 版本开始支持原生的 Dart 开发,最后就让 Dart 和Kotlin 语言成为 Android 的主力开发语言.到时候 Java 哪来的就回哪去吧.

环境

使用 Flutter 开发必须要先有 Android 开发环境或 IOS 开发环境.

在官网下载 SDK 包解压,添加如下的环境变量:

  • 添加FLUTTER_ROOT=[flutter path],这有点类似JAVA_HOME
  • 添加\${FLUTTER_ROOT}/bin到系统路径PATH
  • 添加FLUTTER_STORAGE_BASE_URL=https://storage.flutter-io.cn,这是指定更新 flutter 框架组件用的地址,国内的网络情况大家都懂
  • 添加PUB_HOSTED_URL=https://pub.flutter-io.cn,这是指定flutter 获取 dart 的 pub 包时候的镜像地址,
  • 添加\${FLUTTER_ROOT}/bin/cache/dart-sdk/bin到系统路径PATH中,如果不是想直接调用 dartpub命令,可以不用添加,因为正常开发 Flutter 时,其内部会自动调用.