不管是國內還是國外,用 Flutter 進行開發的廠越來越多,flutter 強勢進入移動開發的視野。今天就來分享一下Flutter 快速上手的方法!
原文地址:https://juejin.cn/post/6872526285654982663
近兩年Flutter的熱度不斷提升,無論在阿里還是外部公司,參與Flutter生態建設的人越來越多。Flutter作爲跨端的UI框架,未來也有很大的可能像Rax一樣作爲集團內營銷活動頁面搭建的DSL。所以目前學習Flutter,參與Flutter生態建設是一件時髦且有價值的事情。
Flutter是什麼
Flutter是谷歌的移動UI框架,可以快速在iOS和Android上構建高質量的原生用戶界面。Flutter可以與現有的代碼一起工作。在全世界,Flutter正在被越來越多的開發者和組織使用,並且Flutter是完全免費、開源的。簡單來說,Flutter是一款移動應用程序SDK,包含框架、控件和一些工具,可以用一套代碼同時構建Android和iOS應用,並且性能可以達到原生應用一樣的性能。Flutter簡介
配置開發環境
Flutter開發可以在macOS,Linux或Windows上完成。雖然您可以在Flutter工具鏈中使用任何編輯器,但IntelliJ IDEA,Android Studio和Visual Studio Code的IDE插件可以簡化開發工作。
- 下載flutter SDK。地址
)
將flutter的bin目錄添加到path中。
執行flutter doctor命令,他會安裝flutter框架,包括dart,而且提示你任何其他需要安裝的依賴。
安裝其他依賴。
在IDE中安裝flutter插件。
體驗
Android Studio (爲Flutter提供完整的IDE體驗)
創建應用
選擇 File>New Flutter Project
選擇 Flutter application 作爲 project 類型, 然後點擊 Next
輸入項目名稱 (如 myapp), 然後點擊 Next
點擊 Finish
等待Android Studio安裝SDK並創建項目. 在項目目錄中,您應用程序的代碼位於 lib/main.dart.
運行應用程序
定位到Android Studio 工具欄:
- 在 target selector 中, 選擇一個運行該應用的Android設備. 如果沒有列出可用,請選擇 Tools>Android>AVD Manager 並在那裏創建一個
- 在工具欄中點擊 Run圖標, 或者調用菜單項 Run > Run.
VS Code(輕量級編輯器,支持Flutter運行和調試)
創建應用
- 啓動 VS Code.
- 調用 View>Command Palette…
- 輸入 ‘flutter’, 然後選擇 ‘Flutter: New Project’ action
- 輸入 Project 名稱 (如myapp), 然後按回車鍵
- 指定放置項目的位置,然後按藍色的確定按鈕
- 等待項目創建繼續,並顯示main.dart文件 在項目目錄中,您應用程序的代碼位於 lib/main.dart.
運行應用程序
- 確保在VS Code的右下角選擇了目標設備
- 按 F5 鍵或調用Debug>Start Debugging
- 等待應用程序啓動
Terminal + 編輯器
創建應用
1、使用 flutter create 命令創建一個project:
$ flutter create myapp
$ cd myapp
運行應用程序
檢查Android設備是否在運行。如果沒有顯示, 請參照 設置。
$ flutter devices
運行 flutter run 命令來運行應用程序:
$ flutter run
如果一切正常, 您應該在您的設備或模擬器上會看到啓動的應用程序:
項目結構
┬
└ projectname
┬
├ android - Android部分的工程文件
├ build - 項目的構建輸出目錄
├ ios - iOS部分的工程文件
├ lib - 項目中的Dart源文件
┬
└ src - 包含其他源文件
└ main.dart - 自動生成的項目入口文件,類似RN的index.js文件
├ test - 測試相關文件
└ pubspec.yaml - 項目依賴配置文件類似於RN的 package.json
如何添加Flutter項目所需的依賴?
- 在Android中,你可以在Gradle文件來添加依賴項;
- 在 iOS 中,通常把依賴添加到 Podfile 中;
- 在RN中,通常是由package.json來管理項目依賴;
Flutter 使用 Dart 構建系統和 Pub 包管理器來處理依賴。這些工具將Android 和 iOS native 包裝應用程序的構建委派給相應的構建系統。
dependencies:
flutter:
sdk: flutter
google_sign_in: ^3.0.3
在Flutter中,雖然在Flutter項目中的Android文件夾下有Gradle文件,但只有在添加平臺相關所需的依賴關係時才使用這些文件。否則,應該使用pubspec.yaml來聲明用於Flutter的外部依賴項。
iOS也是一樣,如果你的 Flutter 工程中的 iOS 文件夾中有 Podfile,請僅在添加iOS平臺相關的依賴時使用它。否則,應該使用pubspec.yaml來聲明用於Flutter的外部依賴項。
如何歸檔圖片資源以及如何處理不同分辨率
雖然Android將resources 和 assets 區別對待,但在Flutter中它們都會被作爲assets處理, 所有存在於Android上res/drawable- *文件夾中的資源都放在Flutter的assets文件夾中。
與Android類似,iOS 同樣將 images 和 assets 作爲不同的東西,而 Flutter 中只有 assets。被放到 iOS 中 Images.xcasset 文件夾下的資源在 Flutter 中被放到了 assets 文件夾中。
在Flutter中assets可以是任意類型的文件,而不僅僅是圖片。例如,你可以把 json 文件放置到 my-assets 文件夾中。
my-assets/data.json
記得在 pubspec.yaml 文件中聲明 assets:
assets:
- my-assets/data.json
然後在代碼中我們可以通過 AssetBundle 來訪問它:
import 'dart:async' show Future;
import 'package:flutter/services.dart' show rootBundle;
Future<String> loadAsset() async {
return await rootBundle.loadString('my-assets/data.json');
}
對於圖片,Flutter 像 iOS 一樣,遵循了一個簡單的基於像素密度的格式。Image assets 可能是 1.0x 2.0x 3.0x 或是其他的任何倍數。這個 devicePixelRatio 表示了物理像素到單個邏輯像素的比率。
Android不同像素密度的圖片和Flutter的像素比率的對應關係
ldpi 0.75x
mdpi 1.0x
hdpi 1.5x
xhdpi 2.0x
xxhdpi 3.0x
xxxhdpi 4.0x
舉個例子,要把一個名爲 my_icon.png 的圖片放到 Flutter 工程中,你可能想要把它放到images文件夾中。把圖片(1.0x)放置到 images 文件夾中,並把其它分辨率的圖片放在對應的子文件夾中,並接上合適的比例係數,就像這樣:
images/my_icon.png // Base: 1.0x image
images/2.0x/my_icon.png // 2.0x image
images/3.0x/my_icon.png // 3.0x image
接下來就可以在pubspec.yaml文件中這樣聲明這個圖片資源:
assets:
- images/my_icon.png
現在,我們就可以藉助AssetImage來訪問它了。
return AssetImage("images/a_dot_burr.jpeg");
也可通過 Image widget 直接使用:
@override
Widget build(BuildContext context) {
return Image.asset("images/my_image.png");
}
如何歸檔strings資源,以及如何處理不同語言?
不像 iOS 擁有一個 Localizable.strings 文件,Flutter目前沒有專門的字符串資源系統。目前,最佳做法是將strings資源作爲靜態字段保存在類中。例如:
class Strings {
static String welcomeMessage = "Welcome To Flutter";
}
然後像如下方式來訪問它:
Text(Strings.welcomeMessage)
默認情況下,Flutter 只支持美式英語字符串。如果你要支持其他語言,請引入 flutter_localizations 包。你可能也要引入 intl 包來支持其他的 i10n 機制,比如日期/時間格式化。
dependencies:
# ...
flutter_localizations:
sdk: flutter
intl: "^0.15.6"
要使用 flutter_localizations 包,還需要在 app widget 中指定 localizationsDelegates 和 supportedLocales。
import 'package:flutter_localizations/flutter_localizations.dart';
MaterialApp(
localizationsDelegates: [
// Add app-specific localization delegate[s] here
GlobalMaterialLocalizations.delegate,
GlobalWidgetsLocalizations.delegate,
],
supportedLocales: [
const Locale('en', 'US'), // English
const Locale('he', 'IL'), // Hebrew
// ... other locales the app supports
],
// ...
)
這些代理包括了實際的本地化值,並且 supportedLocales 定義了 App 支持哪些地區。上面的例子使用了一個 MaterialApp ,所以它既有 GlobalWidgetsLocalizations 用於基礎 widgets,也有 MaterialWidgetsLocalizations 用於 Material wigets 的本地化。如果你使用 WidgetsApp ,則無需包括後者。注意,這兩個代理雖然包括了“默認”值,但如果你想讓你的 App 本地化,你仍需要提供一或多個代理作爲你的 App 本地化副本。
當初始化時,WidgetsApp 或 MaterialApp 會使用你指定的代理爲你創建一個 Localizations widget。Localizations widget 可以隨時從當前上下文中訪問設備的地點,或者使用 Window.locale。
要訪問本地化文件,使用 Localizations.of() 方法來訪問提供代理的特定本地化類。如需翻譯,使用 intl_translation 包來取出翻譯副本到 arb 文件中。把它們引入 App 中,並用 intl 來使用它們。
更多 Flutter 中國際化和本地化的細節,請訪問 internationalization guide ,裏面有不使用 intl 包的示例代碼。
組件
在 Flutter 中一切皆是 組件,僅僅 Widget 的子類和間接子類就有350多個,如此多的組件到底如果學習,真的需要學習 350 多個組件?經濟學中有一個著名的 二八定律 ,而我們學習 Flutter 也適用於二八定律,大部分組件是平時很少用到的,因此作爲初學者,只需學習那 20% 常用的組件即可。
RenderObjectWidget及其子類共有89個:
ProxyWidget及其子類共有34個:
StatelessWidget及其子類共有89個:
StatefulWidget的子類最多,高達141個
組件樹
Flutter 創建App的時候,所有的組件最後會生成一個組件樹,例如如下代碼:
void main() {
runApp(MyApp());
}
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
title: 'Flutter Demo',
theme: ThemeData(
),
home: Scaffold(
body: Text('Hello world!'),
),
);
}
}
main 函數是應用程序開始的地方,運行 MyApp 組件。生成的組件樹如下:
讓 Text 組件居中,修改如下:
Scaffold(
body: Center(
child: Text('Hello world!'),
),
)
給應用程序添加 AppBar:
Scaffold(
appBar: AppBar(),
body: Center(
child: Text('Hello world!'),
),
)
StatefulWidget vs StatelessWidget
Flutter 中組件分爲 無狀態組件(StatelessWidget) 和 有狀態組件(StatefulWidget)兩種。它們唯一的區別就是運行時 重新加載 組件的方式不同,StatelessWidget 組件重新加載時重新創建當前組件的實例,而StatefulWidget組件重新加載時不會重新創建實例,而是重新執行 build 函數。
StatelessWidget 組件創建的方式:
class StatelessWidgetDemo extends StatelessWidget {
@override
Widget build(BuildContext context) {
return Container();
}
}
build 函數返回當前組件,此組件一旦創建將不可改變,build 函數只能執行一次。如果想重新繪製此組件,只能重新創建此組件新的實例。
StatefulWidget 組件創建的方式:
class StatefulWidgetDemo extends StatefulWidget {
@override
_StatefulWidgetDemoState createState() => _StatefulWidgetDemoState();
}
class _StatefulWidgetDemoState extends State<StatefulWidgetDemo> {
@override
Widget build(BuildContext context) {
return Container();
}
}
StatefulWidget 組件的創建方式和 StatelessWidget 不同,State<> 中的 build 函數返回當前組件,有狀態的組件可以在其生命週期內多次重繪,即多次調用 build 函數,而不是創建一個新的實例。
StatefulWidget 組件重繪需要調用 setstate 方法,setstate 會使其自身及其子組件重繪,所以儘量封裝 StatefulWidget 組件,避免無效的重建和重繪,影響性能。
快速書寫小技巧:在 Android Studio 和 VS Code 中 輸入 stl 然後點擊回車,可以快速創建 StatelessWidget 組件,同理輸入 stf 點擊回車,可以快速創建 StatefulWidget 組件,這是編輯器 Live Templates 的功能。
Material vs Cupertino
Flutter 中包含兩套風格的組件,分別是 Material 和 Cupertino ,Cupertino 是 iOS風格的組件,命名都帶 Cupertino 前綴,比如 CupertinoSlider 、 CupertinoDatePicker 等, Material Design 是由 Google 推出,旨在爲手機、平板電腦、臺式機和“其他平臺”提供更一致、更廣泛的“外觀和感覺”。
Flutter 使用一套代碼在不同的平臺上表現一致,它不會根據不同的平臺繪製不同的外形,比如使用 AlertDialog 彈出警告框,不管在 Android 上,還是在 iOS上效果是一樣。
但有一些功能 Flutter 區分平臺,比如 ListView 滑動到底部時繼續滑動,Android 底部會出現淡藍色(默認情況下)拱形,而 iOS 上則沒有,這是因爲 Flutter 在封裝此組件時在代碼中區分了平臺,所以在查看 Flutter 源碼到過程中會經常看到根據不同的平臺做不同處理的情況。
總結
Flutter學習成本主要還是在組件的熟悉上,能熟練常用組件就可以上手項目了,至於其他的控件只需大概瀏覽一下,做項目的時候遇到一些功能能夠想起 Flutter 已經提供了此組件就可以了。
最後
爲了讓大家快速無痛上手 Flutter,在這裏免費分享給大家一份來自阿里大佬Git高星的 Flutter 學習筆記。
2021年還沒上手 Flutter 的移動開發們可以看看這份學習筆記了!
整理大綱
- 爲什麼Flutter是跨平臺開發的終極之選
- 在Windows上搭建Flutter開發環境
- 編寫您的第一個 Flutter App
- Flutter開發環境搭建和調試
- Dart語法篇之基礎語法(一)
- Dart語法篇之集合的使用與源碼解析(二)
- Dart語法篇之集合操作符函數與源碼分析(三)
- Dart語法篇之函數的使用(四)
- Dart語法篇之面向對象基礎(五)
- Dart語法篇之面向對象繼承和Mixins(六)
- Dart語法篇之類型系統與泛型(七)
- Flutter中的widget
注:鑑於目前網上沒有比較規範、系統的整理,該學習手冊中的內容都是根據筆者的一個框架在網上進行的蒐集整理。本文開源,僅用於技術交流分享,感謝大佬熊貓先生對Dart語法
部分的博客分享,感謝一同整理資料的小夥伴。大家可以動動小手,點波關注,瞭解更多flutter內容!
有需要的朋友【點個❤】,然後直接通過下方代碼塊找我領取(備註:簡書)。
// Wechat number(可複製):
study5233
資料詳情
爲什麼Flutter是跨平臺開發的終極之選
- 這是爲什麼?
- 跨平臺開發
- 什麼是 Flutter
- Flutter 的特性
- Flutter 構建應用的工具
- 使用 Flutter 構建的熱門應用
- 構建 Flutter 應用的成本
-
……
在Windows上搭建Flutter開發環境
- 使用鏡像
- 系統要求
- 獲取Flutter SDK
- 編輯器設置
- Android設置
- 起步: 配置編輯器
- 起步: 體驗
- 體驗熱重載
- 創建新的應用
- 運行應用程序
- ……
第三章 編寫您的第一個 Flutter App
- 第1步: 創建 Flutter app
- 第2步: 使用外部包(package)
- 第3步: 添加一個 有狀態的部件(Stateful widget)
- 第4步: 創建一個無限滾動ListView
- 第5步: 添加交互
- 第6步: 導航到新頁面
- 第7步:使用主題更改UI
-
……
第四章 Flutter開發環境搭建和調試
- 開發環境的搭建
- 模擬器的安裝與調試
- 開發環境的搭建
- 模擬器的安裝與調試
-
……
第五章 Dart語法篇之基礎語法(一)
- Hello Dart
- 數據類型
- 變量和常量
- 集合(List、Set、Map)
- 流程控制
- 運算符
- 異常
- 函數
-
……
第六章 Dart語法篇之集合的使用與源碼解析(二)
- List
- Set
- Map
- Queue
- LinkedList
- HashMap
- Map、HashMap、LinkedHashMap、SplayTreeMap區別
- 命名構造函數from和of的區別以及使用建議
-
……
第七章 Dart語法篇之集合操作符函數與源碼分析(三)
- Iterable<E>(Iterable類關係圖、Iterable類方法圖……)
- forEach(介紹、使用方式、源碼解析……)
- map(介紹、使用方式、源碼解析……)
- any(介紹、使用方式、源碼解析……)
- every(介紹、使用方式、源碼解析……)
- where(介紹、使用方式、源碼解析……)
- firstWhere和singleWhere和lastWhere(介紹、使用方式、源碼解析……)
- join(介紹、使用方式、源碼解析……)
- take(介紹、使用方式、源碼解析……)
- takeWhile(介紹、使用方式、源碼解析……)
-
……(內容太多)
第八章 Dart語法篇之函數的使用(四)
- 函數參數
- 匿名函數(閉包,lambda)
- 箭頭函數
- 局部函數
- 頂層函數和靜態函數
- main函數
-
……
第九章 Dart語法篇之面向對象基礎(五)
- 屬性訪問器(accessor)函數setter和getter
- 面向對象中的變量
- 構造函數
- 抽象方法、抽象類和接口
- 類函數
-
……
第十章 Dart語法篇之面向對象繼承和Mixins(六)
- 類的單繼承
- 基於Mixins的多繼承
-
……
第十一章 Dart語法篇之類型系統與泛型(七)
- 可選類型
- 接口類型
- 泛型
- 類型具體化
-
……
第十二章 Flutter中的widget
- Flutter頁面-基礎Widget
- Widget
- StatelessWidget
- Stateful Widget
- State生命週期
- 基礎widget
- 文本顯示
-
……
有需要的朋友【點個❤】,然後直接通過下方代碼塊找我領取(備註:簡書)。
// Wechat number(可複製):
study5233
最後
希望這份資料可以給想要了解 Flutter 並快速上手的朋友幫助以及一個參考方向。
千里之行始於足下,願你我共勉。