欢迎参加“决胜Flutter” 实训课程,这里是你此次实训之旅的起点。
本章将带您快速了解移动开发的现状,然后向您介绍Flutter的发展历史以及优势特点,最后一起动手,搭建高效的开发环境。
由于Flutter 跨平台(同时支持Android、iOS、Web以及PC)的特性,本书将以Mac OS作为操作系统环境,版本号为10.14。如果读者使用的是Windows或者Linux,请结合Flutter官方网站的配置指导进行操作。需要指出的是,Windows和Linux是无法编译生成iOS版本App的。
好了,闲话不多说,我们马上进入正题!
1.1 移动开发的现状
今天,我们不得不承认,移动互联网的出现和兴起,给我们的生活和社交带来了前所未有的改变。一部小小的手机不仅是通信的工具,更有着日常生活、移动办公、社交网络等实用工具的属性,已经成为大部分人可信赖的“伙伴”,不断冲击着报纸、广播、电视等传统媒体。
事实上,移动互联网发展得如此迅速,操作系统只提供了“平台”,更多得益于其丰富的App生态。也正是因为这样的原因,诞生了一个又一个爆款App。在这些爆款的背后,则是无数的UI/UE设计师、软件工程师、测试工程师等幕后英雄的贡献。
同时,随着移动互联网的高速发展,移动App的开发模式也在快速更迭中发展。
最初,为了能够在不同系统环境上运行,通常要求开发团队进行多平台并行开发。通常,开发Android和iOS App一共需要两个开发团队,维护两套源代码,分别进行测试。
后来,人们逐渐意识到,这样的开发效率并不高,成本却不低。因此诞生了一个接一个的跨平台解决方案。比如React Native、PhoneGap、DCloud等等。但无一例外地,它们都无法摆脱低性能的JavaScript或者原生代码依赖,或多或少地存在不足,某些知名的App技术团队已经宣布弃用它们。
亟需一个真正能够打通多平台且高性能的框架来“救场”,Flutter则应运而生。可以说,Flutter的出现有一定的“必然性”。
1.2 初识 Flutter
先让我们和Flutter这个新伙伴说声“你好”,然后了解一下这位新伙伴吧!
1.2.1 Flutter 的历史
说到Flutter的诞生,要追溯到2014年。一开始,它被叫做Sky,同年10月在GitHub上开源。一年后,Sky正式更名为Flutter。首次对外公布Flutter是在2017年5月的Google I/O大会上,从此,Flutter正式进入大家的视野,当时的版本号是Alpha 0.0.6。2018年2月,发布了Flutter 1.0测试版,即Beta1。同年6月份发布预览版,即Preview版本。12月发布1.0正式版。2019年2月,在1.2版本中,首次增加了对Web的支持。
截至目前,GitHub上的Flutter SDK已经有201个发布版本,超过15000多次代码提交,400多位知名工程师参与其中,其问题的响应速度和处理效率同样非常之迅速……这些都奠定了Flutter终将成为开发者称心如意的开发框架。
1.2.2 Flutter 的特性
那么,Flutter 究竟有哪些特性呢?抑或是有哪些优点呢?
- 统一的应用开发体验:Flutter拥有丰富的库,帮助开发者快速实现项目需求。同时,大部分的工具和库同时支持Android和iOS;
- 快速开发:得益于Flutter框架“热重载”的特性,可以帮助开发者更高效地进行开发和测试,更利于修复Bug;
- 界面生动:Flutter支持跨平台开发,同样支持Material Design(原生Android设计语言)和Cupertino(原生iOS设计语言)风格的控件。开发者可根据设计需要实现不同风格的UI界面;
- 原生性能:无论在Android还是iOS环境中,Flutter可以提供与原生应用一样的性能,甚至支持120 HZ的高刷新率;
- 响应式框架:Flutter支持响应式框架,在某些场景下,开发者无需付出任何代价,即可完成不同屏幕的适配,使UI的构建更加轻松;
- 混合开发:Flutter可以与平台原生代码相结合,支持较新的Kotlin和Swift开发语言。借助该特性,可以轻松访问Android或iOS上的原生系统功能和系统API。
到目前为止,Flutter已经广为接受,某些知名厂商已经推出了自己的Flutter App,比如中国的阿里巴巴、腾讯、京东等等。在Flutter官方网站的Showcase页面中,可以找到很多使用Flutter框架开发出的知名产品。

1.2.3 Flutter 的体系结构
Flutter框架采用的是“分层结构”。每一层都建立在另一层的基础上,如下图所示:

显而易见地,整个Flutter框架由三层组成,从上到下分别是Framework(框架)层、Engine(引擎)层以及Embedder(嵌入)层。
-
框架层:框架层由Dart编程语言实现,涵盖了界面组件、动画、手势等等;
-
引擎层:引擎层由C/C++编程语言实现,涵盖了Skia、Dart和Text:
- Skia:负责处理图形,它是一个开源的图形库,自身提供了适用于不同软硬件平台的API。Flutter框架直接使用Skia引擎来渲染组件,既摆脱了对传统浏览器的依赖,又摆脱了平台原生控件;
- Dart:包括Dart运行时环境、垃圾收集、JIT/AOT编译等和Dart相关的支持。经过AOT静态编译的代码能够使用本机指令集运行,从而确保了Flutter App能够和原生App一致的性能;
- Text:负责文本渲染;
-
嵌入层:嵌入层可以理解为“兼容层”。正是嵌入层的出现,才确保了Flutter App可以在不同的平台上运行,该层实现了平台无关性。
到此,是不是有点跃跃欲试,想不想亲手开发出一款Flutter App呢?
不如马上行动,让Flutter App在设备上跑起来!
1.3 搭建 Flutter 开发环境
动手时间到!第一次,我们先来完成“教学关卡”——配置开发环境。
中国有句古话:“工欲善其事,必先利其器。”没有顺手的工具是不行的。通过这一节的学习和实践,相信每位读者都能有一把“开发利器”。
让我们开始吧!
1.3.1 Java 开发环境的安装与配置
配置Java开发环境的目的是为了让我们的电脑可以编译Android应用程序。
和安装其他软件类似地,在Mac OS上配置Java开发环境非常简单。只需下载对应的安装包文件,然后启动安装即可。Java 开发工具包可以在Oracle官方网站找到,然后下载对应版本即可。这里推荐大家安装JDK 8版本。

下载好后启动安装,片刻等待,进度条满即宣告安装结束。

之后,可以启动终端,在终端窗口中键入
java –version
并回车。能正常输出Java版本信息则表明安装配置无误。

1.3.2 Android 开发环境的安装与配置
接下来配置Android开发环境,我们将使用Android Studio作为集成开发环境(也称为IDE)。
首先,我们到Android开发者网站下载Android Studio安装包文件。和前文中所述的Java开发工具包类似,下载后安装即可完成配置过程。

当我们点击“DOWNLOAD ANDROID STUDIO”按钮后,网页会自动识别当前系统并下载最合适的版本。

通常,Android Studio的安装会比Java开发工具包的安装更耗时。静候进度条满,我们便可以启动Android Studio了。
首次启动会弹出向导,这个向导会指引我们对IDE进行初步配置,并下载缺失的SDK。

需要注意的是,通过首次启动向导下载的SDK,默认只包含了最新版本的内容。如果读者要下载更多的SDK版本,便于日后开发,可以在启动Android Studio后,进入Settings(设置),并查找SDK Manager(SDK管理器)。在这里可以下载到Android SDK所有的内容。
接下来,让我们为Android Studio添加编译Flutter App的能力。
进入Settings(设置),然后查找Plugin(插件),在上方的搜索框中键入flutter,并回车。如下图所示:

点击INSTALL(安装),会提示安装Dart,点击YES(是)继续。安装完成后,重新启动Android Studio。启动界面上已经可以看到新建Flutter 工程的入口了:

最后,日后方便地使用adb等命令,还需要把Android SDK的路径加入到环境变量中。启动终端窗口,输入
sudo vi ~/.bash_profile
并回车,开始编辑用户级环境变量。在文件的末尾添加如下内容:
ANDROID_HOME=/Users/wenhan/Library/Android/sdk
export PATH=$PATH:$ANDROID_HOME/tools
export PATH=$PATH:$ANDROID_HOME/platform-tools
保存,然后退出vi编辑器。最后,输入:
source ~/.bash_profile
然后回车,使环境变量立即生效。测试一下adb命令,正常情况将会出现adb使用说明文档。
1.3.3 iOS 开发环境的安装配置
在Mac OS中配置iOS开发环境再简单不过了,只要启动Mac上的App Store,然后搜索Xcode,安装即可。这一步骤可能会耗时很长,在安装时还有可能表现为卡住不动,实际上是安装的内容较多导致的,需要耐心等待。
安装好后,启动终端,输入
sudo xcode-select –switch /Application/Xcode.app/Contents/Developer
并回车,配置Xcode命令行工具。
最后,输入
sudo xcodebuild –license
并回车,接受许可协议。
1.3.4 其他系统必备组件的安装与配置
1.3.4.1 检查系统必备命令行工具
除了上述IDE的配置外,Flutter还依赖某些命令行工具,才能成功完成编译。这些工具包括:
- bash
- curl
- git 2.x
- mkdir
- rm
- unzip
- which
好消息是,Mac OS系统本身已经内置了上述命令,我们仅需确认这些命令能否正常运作即可。
1.3.4.2 设置Flutter Pub镜像站
此外,由于Flutter服务器在国内访问可能出现不稳定的现象,我们需要添加两对环境变量,将Flutter包管理网站指向国内的镜像站。该镜像站由GDG China管理和维护,因此无需担心安全性问题。还记得环境变量的配置方法吗?尝试添加如下两对值:
PUB_HOSTED_URL=https://pub.flutter-io.cn
FLUTTER_STORAGE_BASE_URL=https://storage.flutter-io.cn
如果不慎忘记了配置方法,请参考1.3.2节末尾的内容,如法炮制就好。
1.3.4.3 安装缺失的组件
对于编译iOS App,我们还需要安装一些附加工具,这些附加工具被homebrew管理,它堪称Mac OS平台不可或缺的组件管理器。因此,我们需要先安装homebrew软件包管理工具。方法是启动终端,然后输入如下命令后回车:
/usr/bin/ruby -e "$(curl -fsSL
https://raw.githubusercontent.com/Homebrew/install/master/install)"
系统会自动完成安装。之后,依次执行下列几条命令,完成剩余的配置:
brew update
brew install –HEAD usbmuxd
brew link usbmuxd
brew install –HEAD libimobiledevice
brew install ideviceinstaller ios-deploy cocoapods
pod setup
1.3.4.4 安装Visual Studio Code
在正式进行Flutter App开发前,我们需要学习一种全新的编程语言——Dart。学习Dart编程语言无需Android Studio,也无需任何移动设备。与此相反,一款得心应手的文本编辑器会更加合适,所以更推荐各位读者使用Visual Studio Code。
Visual Studio Code同样是跨平台的IDE,因此无论您是使用Mac OS,Windows或者是Linux,都可以使用Visual Studio Code。
官方网站下载Visual Studio Code,运行安装程序进行安装,之后不要忘记安装Flutter插件。

1.3.5 Flutter 开发环境的安装与配置
1.3.5.1 Flutter SDK的下载和配置
接下来,我们需要下载和配置Flutter SDK。
下载Flutter SDK的方式有两种选择。第一种是通过Flutter官方网站提供的下载链接;第二种则是通过Git Clone(克隆)的方式下载。由于服务器偶尔会出现连接不稳定的现象,因此,第二种方式最更稳妥的选择。
启动终端,定位到要存放Flutter SDK的目录下,输入:
git clone -b stable https://github.com/flutter/flutter.git
此处的stable表示要下载稳定版,也可以改为dev来下载最新的开发版。

根据网络连接状况,这个过程通常会持续几分钟,需要耐心等待。
下载好后,别忘了配置环境变量,它可以帮助我们在任何位置执行flutter命令。按照前文中提过的方法,这里只需追加PATH变量值即可,如下所示:
export PATH="$PATH:~/Development/flutter/bin"
1.3.5.2 复查所有环境变量的配置
到此,关于环境变量的配置就全部完成了,我们回顾一下所有配置的环境变量,如下图所示:

需要特别注意的是,上述环境变量配置的值并非在所有电脑上都一致。请各位读者结合自身电脑的具体情况进行配置,并在配置后执行相应的指令测试,以确保环境配置无误。
1.3.5.3 执行Flutter 自诊断脚本
运行终端,输入
flutter doctor
并回车,等待诊断完成。出现下图所示的输出则代表配置准确无误。

诊断进程结束后,会出现类似上图的诊断报告,除了表示正确的对勾外,还可能会遇到感叹号或者叉号。出现感叹号表示它是一条警告,可能不会影响工程的正常编译运行;而叉号则要引起重视了,它表示一种错误。不进行处理的话将会影响工程的编译和运行。
如果不幸出现了由叉号的项目,别担心,您可以在1.3.7 疑难排查小节中找到解决它们的办法。
1.3.6 升级 Flutter SDK
由于Flutter处在快速发展迭代中,时刻保持最新不但可以体验到新版本带给我们的新功能,而且可以规避老版本中存在的某些问题。
当我们按照前文所描述的方法配置好环境变量后,随时可以在终端执行
flutter upgrade
命令检查并更新到最新版本的flutter SDK了。
1.3.7 疑难排查
-
git clone速度过慢甚至报错:出现该问题,可以尝试访问官网,进入SDK下载页面,直接下载,并在完成后解压。压缩包内存在.git文件夹,不影响日后的版本升级;
-
出现警告(Android toolchain - develop for Android devices…):执行
flutter doctor --android-licenses
并同意所有的许可协议;
-
出现错误(Missing Xcode dependency: Python module "six"):执行
pip install six
或
sudo easy_install six
或依次执行:
brew reinstall python@2
pip install six; -
升级SDK过程中出错:检查是否配置了正确的环境变量,或者直接重新下载最新版本。
1.4 首个 Flutter App——计数器
接下来,我们创建一个计数器应用,用户每点击依次屏幕右下方的按钮,屏幕中间的数值增加1,如下图所示:

计数器App是创建Flutter 工程后的默认App,我们无需修改代码,直接运行即可实现。
1.4.1 创建 Flutter工程
有两种方式创建Flutter工程,第一种是通过Android Studio的新建工程向导;另外一种是通过flutter命令行。
作者建议使用flutter 命令行创建项目,然后在Android Studio中打开。因为在网络连接不稳定时,新建工程向导可能会导致Android Studio停止响应。
使用命令行创建项目的方法非常简单,首先来到要存放工程代码的目录,然后执行:
flutter create hello_flutter
稍等片刻,即可完成工程的创建。有关flutter的更多命令行用法,将在1.4.3节中提及。
创建好工程后,启动Android Studio,选择“Open an existing Android Studio project”,在弹出的目录选择对话框中,定位到代码所在目录,点击OK,即可打开工程。

怎么样,还算简单吧?
1.4.2 在设备上运行 Flutter App
最后,我们把代码运行在设备上。您可以选择在电脑上启动模拟器,或者连接一台开启了调试权限的手机。
作者建议各位使用实体设备,而非模拟器。一方面,实体设备最接近用户最终体验,并且更加流畅;另一方面,某些传感器,如NFC、蓝牙等,是很难通过模拟器实现的。本书也将结合实体设备——一台真正的手机(Android)进行讲解。
启动手机,开启开发者选项中的USB调试,然后连接电脑。点击Android Studio右上角的绿色小三角图标,稍等片刻,像图1.15那样,一个简单的flutter App就部署到手机上了。尝试和它互动一下吧!
1.4.3 Flutter 常用命令
在实际开发中,我们有必要掌握一些flutter的常用命令,这将帮助我们更有效率地进行开发。
-
创建项目:
- flutter create my_app:以my_app为名创建工程;
- flutter create -a kotlin my_app:以my_app为名创建工程,并添加对Kotlin语言的支持;
- flutter create -i swift my_app:以my_app为名创建工程,并添加对Swift语言的支持;
-
获取工程中引用的库:
flutter packages get
-
更新工程中引用的库:
flutter packages upgrade
-
运行App:
- flutter run:运行在默认的首选设备上;
- flutter run -d 5554:运行在ID为5554的设备上。
-
进入调试模式:
flutter attach
-
打包生成安装文件:
- flutter build apk:生成Android平台的安装包文件;
- flutter build ios:生成iOS平台的安装包文件。
1.5 小结
请回顾以下几个知识点,确保这些内容都已经了然于心:
- flutter的特点与优势;
- flutter框架的体系结构;
- 开发flutter App的环境搭建;
- 升级已有的flutter SDK;
- 创建简单的flutter App;
- 运行flutter App在设备上;
- 必知必会的flutter常用命令。
你可能会注意到,上述内容并未涵盖本章的所有方面。这是因为上述的知识点是必须要掌握的,而非仅作了解。
请您确认上述内容已经完全掌握后,再进入下一章的学习。
在下一章中,我们要进行一场“特训”,目的是让各位读者快速入门并掌握Dart开发语言。我们还将结合计算机领域的某些经典算法进行强化练习,请做好准备,我们即刻出发!
网友评论