# 前言
現在,主流的移動開發平臺是Android和iOS,每個平臺上的開發技術不太一樣,針對每個平臺開發應用需要特定的人員,但這樣一來開發效率低下,因而需要進行跨平臺開發。跨平臺技術從最開始的Hybrid混合開發技術,到React Native的橋接技術,一直在演進。
Hybrid開發主要依賴于WebView。但WebView是一個重量級的控件,很容易產生內存問題,而且復雜的UI在WebView上顯示的性能不好。React Native技術拋開了WebView,利用JavaScript Core來做橋接,將JavaScript調用轉為Native調用。React Native最終會生成對應的自定義原生控件。這種策略將框架本身和App開發者綁在系統的控件上,不僅框架本身需要處理大量平臺相關的邏輯,隨著系統版本變化和API的變化,開發者可能也需要處理不同平臺的差異,甚至有些特性只能在部分平臺上實現,這樣使得跨平臺特性大打折扣。
Flutter是最新的跨平臺開發技術,可以橫跨Android、iOS、MacOS、Windows、Linux等多個系統。Flutter采用了更為徹底的跨平臺方案,即自己實現了一套UI框架,然后直接在GPU上渲染UI頁面。
筆者最早接觸的跨平臺技術是Adobe Air技術,寫一套Action Script代碼可以運行在PC、Android及iOS三大平臺上。目前,筆者與朋友開發視頻會議產品,需要最大化地減少前端的開發及維護工作量,所以,我們先后考察過Cordova、React Native及Flutter等技術。我們覺得Flutter方案更加先進,效率更高,后來就嘗試用Flutter開發了全球第一個開源的WebRTC插件(可在GitHub上搜索Flutter WebRTC)。
寫作本書的目的是想傳播Flutter知識(因為Flutter確實優秀),想為Flutter社區做點貢獻的同時也為我們的產品打下堅實的技術基礎。通過寫作本書,筆者查閱了大量的資料,使得知識體系擴大了不少,收獲良多。
### 本書主要內容
第1章介紹Flutter的基本概念,并搭建第一個Flutter程序,來感受一下Flutter之美。
第2章介紹幾個重要知識點,如入口程序、Material Design、Flutter主題、無狀態組件和有狀態組件、使用包資源、Http請求。
第3章簡單介紹Dart語言。Dart語言是Flutter SDK指定的語言,我們很有必要補充一下它的基礎知識,包括語法特性、基本語句、面向對象等。
第4章介紹常用組件。Flutter里有一個非常重要的核心理念:一切皆為組件,本章主要講解開發中用得最頻繁的組件,如容器組件、圖片組件、文本組件、圖標組件和表單組件等。
第5章介紹Material Design風格的組件,Material Design風格是一種非常有質感的設計風格,并提供一些默認的交互動畫。本章將分類介紹這些組件。
第6章介紹Cupertino風格的組件,這是一類iOS風格的組件,如CupertinoTabBar、CupertinoPageScaffold、CupertinoTabScaffold、CupertinoTabView等。
第7章介紹頁面布局的基礎知識和技巧,如基礎布局處理、寬高尺寸處理、列表及表格布局等,最后通過一個綜合布局示例來演示如何編寫復雜的頁面。
第8章介紹如何處理手勢,如輕擊、拖動和縮放等。Flutter中提供GestureDetector進行手勢檢測,并為手勢檢測提供了相應的監聽。
第9章介紹如何加載、處理、展示資源和圖片,如添加資源和圖片、自定義字體等。
第10章介紹路由及導航是如何處理的,包括頁面的渲染以及數據傳遞。
第11章介紹組件裝飾和視覺效果的處理,如Opacity(透明度處理)、DecoratedBox(裝飾盒子)、RotatedBox(旋轉盒子)、Clip(剪裁處理)和CustomPainter(自定義畫板)。
第12章介紹動畫效果的制作,包含兩個動畫組件的使用:用AnimatedOpacity實現漸變效果、用Hero實現頁面切換動畫。
第13章介紹Flutter插件開發的入門知識。Flutter插件可以和原生程序打交道,比如調用藍牙、啟用WIFI、打開手電筒,等等。
第14章介紹開發工具及使用技巧,介紹幾款常用的IDE工具,從代碼的編寫、輔助功能、程序調試、性能分析等多方面講解工具及使用技巧。
第15章介紹測試與發布應用,包括:測試應用、發布Android版和iOS版App。
第16章通過一個綜合案例介紹如何使用Flutter實現即時通訊App的界面。
#### 閱讀建議
本書是一本基礎入門加實戰的書籍,既有基礎知識,又有豐富示例,包括詳細的操作步驟,實操性強。由于Flutter大量使用組件,所以本書對組件的講解很詳細,包括基本概念、屬性及代碼示例。每個組件都配有小例子,力求精簡,還提供了配套網站提供完整代碼,復制完整代碼就可以立即看到效果。這樣會給讀者信心,在輕松掌握基礎知識的同時快速進入實戰。
如果你正在使用類似React Native等跨平臺的技術,那么學習Flutter相對輕松很多。使用Flutter構建應用時,需要Android和iOS知識,因為Flutter依賴移動操作系統提供眾多功能和配置。Flutter是一種為移動設備構建用戶界面的新方式,但它有一個插件機制可與Android和iOS進行數據及任務通信。本書有一章專門講解Flutter的插件開發技術,可以作為進一步學習的起點。
Flutter引用了大量Web開發的知識,比如FlexBox布局方式、盒模型等,這些都引用了CSS的一些思想。所以從UI界面的實現角度來說,只需要熟悉Dart語言就能輕松上手Flutter。本書專門有一章介紹Dart語言的基礎知識。
建議讀者在一開始先把第1~3章基礎理論通讀一遍。到第4章時實際操作并運行每個例子,這樣就能開發Flutter最簡單的界面了。
第5章和第6章通讀即可。第7章介紹的構建頁面布局都是開發中常用的布局方法,建議讀者仔細閱讀、實際操作并運行每個例子。尤其是最后的布局綜合例子,按步驟都走一遍,就能理解布局的思路。
第8~12章涵蓋Flutter的高級用法,在開發中也經常使用。可以根據實際項目開發和學習的需要閱讀。第13章介紹Flutter插件開發。這需要具備原生開發的知識,比如Java、Objective-C等相關知識。如果讀者不需要開發插件可以略過。第14~16章實操性很強,讀者只要根據書中的步驟仔細操作,就能快速掌握。
#### 關于隨書代碼
本書所列代碼力求完整,但由于篇幅所限,代碼沒有全放在書里。完整代碼在以下網址:
<http://www.flutter100.net>
<https://github.com/kangshaojun>
#### 致謝
首先感謝機械工業出版社吳怡編輯的耐心指點,以及推動了本書的出版。
感謝朋友段偉偉工程師,江湖人稱“魚老大”,國內骨灰級WebRTC開發者、視頻會議產品合作者。在這里感謝魚老大的技術分享及幫助。
感謝陳波及陳志紅兩位好友。在本書交稿壓力最大的時侯,從內容安排及語言潤色方面,都提供了一些非常有用的建議。還感謝高文翠老師對本書大綱的指導。
最后還要感謝我的家人。感謝我的母親及妻子,在我寫作過程中承擔了全部的家務并照顧小孩兒,使我可以全身心地投入寫作工作。在寫作那段時間,正好家里閣樓裝修,感謝我的父親,他親自管理裝修工程,幫我節省了很多時間和精力。我愛你們,和你們在一起是幸運的事情!
亢少軍
2018年12月7日
- 前言
- 第1章 開啟Flutter之旅
- 1.1 Flutter的特點與核心概念
- 1.1.1 一切皆為組件
- 1.1.2 組件嵌套
- 1.1.3 構建Widget
- 1.1.4 處理用戶交互
- 1.1.5 什么是狀態
- 1.1.6 分層的框架
- 1.2 開發環境搭建
- 1.2.1 Windows環境搭建
- 1.2.2 MacOS環境搭建
- 1.3 第一個Flutter程序
- 第2章 Flutter基礎知識
- 2.1 入口程序
- 2.2 Material Design設計風格
- 2.3 Flutter主題
- 2.3.1 創建應用主題
- 2.3.2 局部主題
- 2.3.3 使用主題
- 2.4 無狀態組件和有狀態組件
- 2.5 使用包資源
- 2.6 Http請求
- 第3章 Dart語言簡述
- 3.1 Dart重要概念與常用開發庫
- 3.2 變量與基本數據類型
- 3.3 函數
- 3.4 運算符
- 3.5 流程控制語句
- 3.6 異常處理
- 3.7 面向對象
- 3.7.1 實例化成員變量
- 3.7.2 構造函數
- 3.7.3 讀取和寫入對象
- 3.7.4 重載操作
- 3.7.5 繼承類
- 3.7.6 抽象類
- 3.7.7 枚舉類型
- 3.7.8 Mixins
- 3.8 泛型
- 3.9 庫的使用
- 3.10 異步支持
- 3.11 元數據
- 3.12 注釋
- 第4章 常用組件
- 4.1 容器組件
- 4.2 圖片組件
- 4.3 文本組件
- 4.4 圖標及按鈕組件
- 4.4.1 圖標組件
- 4.4.2 圖標按鈕組件
- 4.4.3 凸起按鈕組件
- 4.5 列表組件
- 4.5.1 基礎列表組件
- 4.5.2 水平列表組件
- 4.5.3 長列表組件
- 4.5.4 網格列表組件
- 4.6 表單組件
- 第5章 Material Design風格組件
- 5.1 App結構和導航組件
- 5.1.1 MaterialApp(應用組件)
- 5.1.2 Scaffold(腳手架組件)
- 5.1.3 AppBar(應用按鈕組件)
- 5.1.4 BottomNavigationBar(底部導航條組件)
- 5.1.5 TabBar(水平選項卡及視圖組件)
- 5.1.6 Drawer(抽屜組件)
- 5.2 按鈕和提示組件
- 5.2.1 FloatingActionButton(懸停按鈕組件)
- 5.2.2 FlatButton(扁平按鈕組件)
- 5.2.3 PopupMenuButton(彈出菜單組件)
- 5.2.4 SimpleDialog(簡單對話框組件)
- 5.2.5 AlertDialog(提示對話框組件)
- 5.2.6 SnackBar(輕量提示組件)
- 5.3 其他組件
- 5.3.1 TextField(文本框組件)
- 5.3.2 Card(卡片組件)
- 第6章 Cupertino風格組件
- 6.1 CupertinoActivityIndicator組件
- 6.2 CupertinoAlertDialog對話框組件
- 6.3 CupertinoButton按鈕組件
- 6.4 Cupertino導航組件集
- 第7章 頁面布局
- 7.1 基礎布局處理
- 7.1.1 Container(容器布局)
- 7.1.2 Center(居中布局)
- 7.1.3 Padding(填充布局)
- 7.1.4 Align(對齊布局)
- 7.1.5 Row(水平布局)
- 7.1.6 Column(垂直布局)
- 7.1.7 FittedBox(縮放布局)
- 7.1.8 Stack/Alignment
- 7.1.9 Stack/Positioned
- 7.1.10 IndexedStack
- 7.1.11 OverflowBox溢出父容器顯示
- 7.2 寬高尺寸處理
- 7.2.1 SizedBox(設置具體尺寸)
- 7.2.2 ConstrainedBox(限定最大最小寬高布局)
- 7.2.3 LimitedBox(限定最大寬高布局)
- 7.2.4 AspectRatio(調整寬高比)
- 7.2.5 FractionallySizedBox(百分比布局)
- 7.3 列表及表格布局
- 7.3.1 ListView
- 7.3.2 GridView
- 7.3.3 Table
- 7.4 其他布局處理
- 7.4.1 Transform(矩陣轉換)
- 7.4.2 Baseline(基準線布局)
- 7.4.3 Offstage(控制是否顯示組件)
- 7.4.4 Wrap(按寬高自動換行布局)
- 7.5 布局綜合示例
- 7.5.1 布局分析
- 7.5.2 準備素材
- 7.5.3 編寫代碼
- 第8章 手勢
- 8.1 用GestureDetector進行手勢檢測
- 8.2 用Dismissible實現滑動刪除
- 第9章 資源和圖片
- 9.1 添加資源和圖片
- 9.1.1 指定assets
- 9.1.2 加載assets
- 9.1.3 平臺assets
- 9.2 自定義字體
- 第10章 路由及導航
- 10.1 頁面跳轉基本使用
- 10.2 頁面跳轉發送數據
- 10.3 頁面跳轉返回數據
- 第11章 組件裝飾和視覺效果
- 11.1 Opacity(透明度處理)
- 11.2 DecoratedBox(裝飾盒子)
- 11.3 RotatedBox(旋轉盒子)
- 11.4 Clip(剪裁處理)
- 11.5 案例——自定義畫板
- 第12章 動畫
- 12.1 用AnimatedOpacity實現漸變效果
- 12.2 用Hero實現頁面切換動畫
- 第13章 Flutter插件開發
- 13.1 新建插件
- 13.2 運行插件
- 13.3 示例代碼分析
- 第14章 開發工具及使用技巧
- 14.1 IDE集成開發環境
- 14.1.1 Android Studio/IntelliJ
- 14.1.2 Visual Studio Code
- 14.2 Flutter SDK
- 14.3 使用熱重載
- 14.4 格式化代碼
- 14.5 Flutter組件檢查器
- 第15章 測試與發布應用
- 15.1 測試應用
- 15.1.1 簡介
- 15.1.2 單元測試
- 15.1.3 Widget測試
- 15.1.4 集成測試
- 15.2 發布Android版App
- 15.2.1 檢查App Manifest
- 15.2.2 查看構建配置
- 15.2.3 添加啟動圖標
- 15.2.4 App簽名
- 15.2.5 構建發布版APK并安裝在設備上
- 15.3 發布iOS版App
- 15.3.1 準備工作
- 15.3.2 在iTunes Connect上注冊應用程序
- 15.3.3 注冊一個Bundle ID
- 15.3.4 在iTunes Connect上創建應用程序記錄
- 15.3.5 查看Xcode項目設置
- 15.3.6 添加應用程序圖標
- 15.3.7 準備發布版本
- 15.3.8 將應用發布到App Store
- 第16章 綜合案例——即時通訊App界面實現
- 16.1 項目介紹
- 16.2 項目搭建
- 16.2.1 新建項目
- 16.2.2 添加源碼目錄及文件
- 16.3 入口程序
- 16.4 加載頁面
- 16.5 應用頁面
- 16.6 搜索頁面
- 16.6.1 布局拆分
- 16.6.2 請求獲取焦點
- 16.6.3 自定義TouchCallBack組件
- 16.6.4 返回文本組件
- 16.6.5 組裝實現搜索頁面
- 16.7 聊天頁面
- 16.7.1 準備聊天消息數據
- 16.7.2 聊天消息列表項實現
- 16.7.3 聊天消息列表實現
- 16.8 好友頁面
- 16.8.1 準備好友列表數據
- 16.8.2 好友列表項實現
- 16.8.3 好友列表頭實現
- 16.8.4 ContactSiderList類
- 16.8.5 Contacts類
- 16.9 我的頁面
- 16.9.1 通用列表項實現
- 16.9.2 Personal類