手把手教你入門(mén)Flutter:環(huán)境搭建 + Demo講解


前言

  • Flutter 作為Google出品的一個(gè)新興的跨平臺(tái)移動(dòng)客戶端UI開(kāi)發(fā)框架,正在被越來(lái)越多的開(kāi)發(fā)者和組織使用,包括阿里的咸魚(yú)、騰訊的微信等。

    示意圖

  • 今天,我將獻(xiàn)上一份《全面 & 詳細(xì)的Flutter入門(mén)開(kāi)發(fā)攻略》,旨在讓你快速上手Flutter開(kāi)發(fā),包括環(huán)境搭建、關(guān)鍵語(yǔ)法和示例講解,希望你們會(huì)喜歡。

示意圖

目錄

本文主要分文兩大部分:環(huán)境搭建 & 示例講解


Flutter環(huán)境搭建

此處搭建主要是基于Mac OS。

1. 安裝brew

  • 定義:包管理工具,具體介紹可參考:官網(wǎng)地址
  • 作用:方便進(jìn)行安裝 / 卸載 / 更新各種軟件包,如:本文提及的flutter、nodejs等等
  • 應(yīng)用場(chǎng)景:快速搭建本地開(kāi)發(fā)環(huán)境
  • 安裝:
命令行下運(yùn)行:
/usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"

2. 下載Flutter SDK

示意圖
  • 將下載的SDK解壓到本地目錄

3. 環(huán)境變量配置

命令行輸入以下文件

// 1. 打開(kāi)配置文件
open ~/.bash_profile
// 若不存在此文件,則直接新創(chuàng)建再打開(kāi)即可,終端輸入:
cd ~
touch .bash_profile
open ~/.bash_profile

// 2. 在打開(kāi)的配置文件下添加以下語(yǔ)句 & 保存
export PATH=/Users/carson.ho/AndroidStudioProjects/flutter/bin:$PATH // 注:.../bin 前需填寫(xiě)的是你剛才解壓flutter SDK的目錄
export PUB_HOSTED_URL=https://pub.flutter-io.cn
export FLUTTER_STORAGE_BASE_URL=https://storage.flutter-io.cn

// 3. 生效配置
source ~/.bash_profile

4. 安裝Flutter插件(Flutter Plugin)

打開(kāi)Android Studio,按如圖下安裝Flutter Plugin:


示意圖

5. 環(huán)境檢查

終端命令行輸入

flutter doctor

若是用于Android場(chǎng)景,那么安裝成功提示如下:(若是iOS場(chǎng)景,則需安裝標(biāo)紅的地方)


示意圖

錯(cuò)誤處理:若存在報(bào)錯(cuò),則按項(xiàng)進(jìn)行檢查即可:安裝對(duì)應(yīng)版本Android SDK & Android Studio。

可到此處進(jìn)行快速下載:http://www.androiddevtools.cn/

至此,關(guān)于Flutter的環(huán)境搭建講解完畢。


入門(mén)示例講解

此處將手把手帶你創(chuàng)建一個(gè)Flutter工程并進(jìn)行Demo展示,讓你快速入門(mén)Flutter。

步驟1:Android Studio創(chuàng)建Flutter工程

示意圖
示意圖

簡(jiǎn)單介紹每項(xiàng):

  • Flutter Application:標(biāo)準(zhǔn)的Flutter App工程,包含標(biāo)準(zhǔn)的Dart層與Native平臺(tái)層;
  • Flutter Module:Flutter組件工程,僅包含Dart層實(shí)現(xiàn),Native平臺(tái)層子工程為通過(guò)Flutter自動(dòng)生成的隱藏工程;
  • Flutter Plugin:Flutter平臺(tái)插件工程,包含Dart層與Native平臺(tái)層的實(shí)現(xiàn);
  • Flutter Package:Flutter純Dart插件工程,僅包含Dart層的實(shí)現(xiàn),往往定義一些公共Widget。

此處選擇Flutter Application進(jìn)行展示。

步驟2:工程結(jié)構(gòu)解析

示意圖

在Flutter上使用的代碼,主要是寫(xiě)在 main.dart文件上,即工程一旦運(yùn)行,是先執(zhí)行main.dart文件。

步驟3:實(shí)例代碼解析

  • 本文直接采用Flutter官方Demo說(shuō)明,從而對(duì)Flutter的開(kāi)發(fā)進(jìn)行快速入門(mén)。
  • 點(diǎn)擊main.dart即可看到Demo代碼,具體解析如下:
/**
 *  1. 導(dǎo)入Material UI組件庫(kù)
 **/
import 'package:flutter/material.dart';
// 定義:Material是Flutter 實(shí)現(xiàn) Material Design設(shè)計(jì)風(fēng)格(谷歌推出的一套視覺(jué)設(shè)計(jì)語(yǔ)言)的基礎(chǔ)包,
// 作用:包含文本輸入框(Text)、圖標(biāo)( Icon)、圖片(Image)、行排列布局( Row)、 列排列布局(Column)、 Decoration(裝飾器)、動(dòng)畫(huà)等組件
// 因此基本上每個(gè)flutter程序的代碼,第一行代碼都會(huì)引入這個(gè)包


/**
 *  2. Flutter應(yīng)用的入口:runApp(),即首先執(zhí)行該函數(shù)
 *  作用:將給定的組件(widget)顯示在屏幕上
 *  注:若不使用runApp(),程序仍會(huì)正常運(yùn)行,但屏幕上什么都不會(huì)顯示,相當(dāng)于一個(gè)Dart控制臺(tái)程序
 **/
void main() => runApp(MyApp());

// 等價(jià)于
// void main() {
// return runApp(MyApp());
// }
// 下面,將執(zhí)行MyApp -> 跳轉(zhuǎn)到3

/**
 *  3. 自己定義的組件類MyApp,繼承自StatelessWidget
 *  作用:整個(gè)應(yīng)用的底層Widget
 *  注:StatelessWidget是無(wú)狀態(tài)組件,具體介紹請(qǐng)?zhí)隹锤戒?
 **/
class MyApp extends StatelessWidget {

  // build():Widget中的生命周期方法
  // 作用:描述如何構(gòu)建UI界面
  // 關(guān)于其他生命周期方法,請(qǐng)看附錄2
  @override
  Widget build(BuildContext context) {
    // Material App是一個(gè)使用Material Design設(shè)計(jì)風(fēng)格的應(yīng)用,具體介紹請(qǐng)看附錄3
    // 此處設(shè)置了標(biāo)題、主題 & 要顯示的界面 -> MyHomePage -> 跳轉(zhuǎn)4
    return MaterialApp(
      title: 'Flutter Demo',
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: MyHomePage(title: 'Flutter Demo Home Page'),
    );
  }
}

/**
 *  4. 自己定義的組件類,繼承自StatefulWidget
 *  作用:設(shè)置應(yīng)用打開(kāi)的顯示界面
 *  注:StatefulWidget是有狀態(tài)組件,具體介紹請(qǐng)?zhí)隹锤戒?
 **/
class MyHomePage extends StatefulWidget {
  MyHomePage({Key key, this.title}) : super(key: key);

  final String title;

  @override
  _MyHomePageState createState() => _MyHomePageState();
  // 調(diào)用父類StatefulWidget的createState(),用于創(chuàng)建和StatefulWidget相關(guān)的狀態(tài) -> 跳轉(zhuǎn)5
}

/**
 *  5. 繼承自State類
 *  作用:實(shí)現(xiàn)一系列Widget生命周期方法 & 更新Widget的狀態(tài),
 *  注:StatefulWidget是有狀態(tài)組件,具體介紹請(qǐng)?zhí)隹锤戒?
 **/

class _MyHomePageState extends State<MyHomePage> {

  // 用于后續(xù)點(diǎn)擊按鈕統(tǒng)計(jì)
  int _counter = 0;

  void _incrementCounter() {
    setState(() {
      _counter++;
    });
  }

  // build():描述如何構(gòu)建UI界面
  @override
  Widget build(BuildContext context) {

  // 此處直接采用Scaffold
  // Scaffold實(shí)現(xiàn)了基本的 Material Dsign布局
  // 只要是在 Material Design中定義過(guò)的單個(gè)界面顯示的布局組件元素,都可以使用Scaffold繪制 
    return Scaffold(
      appBar: AppBar( // 顯示在界面頂部的AppBar
      title: Text(widget.title),
      ),
      body: Center( // 當(dāng)前界面顯示的主要內(nèi)容
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: <Widget>[
            Text(
              'You have pushed the button this many times:',
            ),
            Text(
              '$_counter', // 顯示的內(nèi)容是_counter變量
              style: Theme.of(context).textTheme.display1,
            ),
          ],
        ),
      ),
      floatingActionButton: FloatingActionButton( // 即FAB,最常用的Widget組件 = 圓形按鈕
        onPressed: _incrementCounter, // 設(shè)置點(diǎn)擊事件->調(diào)用_incrementCounter()
        tooltip: 'Increment', // 長(zhǎng)按按鈕提示
        child: Icon(Icons.add), // 按鈕的子視圖:“+”樣式
        // 關(guān)于FAB還有更多的樣式 & 屬性設(shè)置,此處不做過(guò)多介紹
      ), 
    );
  }
}
附錄1:StatelessWidget
  • 定義:無(wú)狀態(tài)組件,繼承自widget類。
  • 特點(diǎn):無(wú)狀態(tài)、不可變,屬性不能改變
  • 示例:例如Icon、IconButton、和Text
附錄2:Widget生命周期方法介紹
示意圖
示意圖
附錄3:Material App
  • 定義:使用Material Design設(shè)計(jì)風(fēng)格的應(yīng)用
  • 作用:包含了Material Design設(shè)計(jì)風(fēng)格的應(yīng)用所需要的基本控件
  • 常用屬性:
示意圖

此處詳細(xì)列出主題(Theme)的設(shè)置

示意圖
附錄4:StatefulWidget
  • 定義:有狀態(tài)組件,繼承自widget類。
  • 特點(diǎn):存在狀態(tài) & 隨著Widget生命周期發(fā)生變化
  • 示例:如Checkbox、Radio、Slider、InkWell、Form、and、TextField
  • 自定義:需繼承 & 實(shí)現(xiàn)兩個(gè)類
  1. StatefulWidget類:實(shí)現(xiàn)StatefulWidget的createState() = 創(chuàng)建和Statefulwidget相關(guān)的狀態(tài)
  2. State類:實(shí)現(xiàn)一系列Widget的生命周期方法,用于更新Widget的狀態(tài),具體方法同附錄2:Widget生命周期方法介紹

請(qǐng)回到原代碼處

特別說(shuō)明:使用第三方功能庫(kù)

在實(shí)際開(kāi)發(fā)過(guò)程中,會(huì)使用到第三方功能庫(kù),在Flutter中,使用第三方功能庫(kù)的步驟如下:

  • 步驟1:使用pubspec.yaml文件進(jìn)行配置

在iOS中,使用CocoaPods;在Android中使用Gradle

示意圖
  • 步驟2:獲取所需要的庫(kù)到工程中,通過(guò)終端命令行執(zhí)行:
// 步驟1:進(jìn)入到工程目錄
cd 工程目錄

// 步驟2:下載Flutter包
flutter packages get

至此,關(guān)于Flutter的開(kāi)發(fā)入門(mén)講解完畢。


總結(jié)

  • 本文全面介紹了Flutter入門(mén)開(kāi)發(fā)學(xué)習(xí)知識(shí),包括:環(huán)境搭建、關(guān)鍵語(yǔ)法和示例講解
  • 接下來(lái)推出的文章,我將繼續(xù)講解Flutter的相關(guān)知識(shí),包括使用語(yǔ)法、實(shí)戰(zhàn)等,感興趣的讀者可以繼續(xù)關(guān)注我的博客哦:Carson_Ho的Android博客

請(qǐng)點(diǎn)贊!因?yàn)槟銈兊馁澩?鼓勵(lì)是我寫(xiě)作的最大動(dòng)力!

相關(guān)文章閱讀
Android開(kāi)發(fā):最全面、最易懂的Android屏幕適配解決方案
Android開(kāi)發(fā):史上最全的Android消息推送解決方案
Android開(kāi)發(fā):最全面、最易懂的Webview詳解
Android開(kāi)發(fā):JSON簡(jiǎn)介及最全面解析方法!
Android四大組件:Service服務(wù)史上最全面解析
Android四大組件:BroadcastReceiver史上最全面解析


歡迎關(guān)注Carson_Ho的簡(jiǎn)書(shū)!

不定期分享關(guān)于安卓開(kāi)發(fā)的干貨,追求短、平、快,但卻不缺深度

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 229,698評(píng)論 6 539
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 99,202評(píng)論 3 426
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人,你說(shuō)我怎么就攤上這事。” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 177,742評(píng)論 0 382
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我,道長(zhǎng),這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 63,580評(píng)論 1 316
  • 正文 為了忘掉前任,我火速辦了婚禮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 72,297評(píng)論 6 410
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 55,688評(píng)論 1 327
  • 那天,我揣著相機(jī)與錄音,去河邊找鬼。 笑死,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,693評(píng)論 3 444
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 42,875評(píng)論 0 289
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 49,438評(píng)論 1 335
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 41,183評(píng)論 3 356
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 43,384評(píng)論 1 372
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,931評(píng)論 5 363
  • 正文 年R本政府宣布,位于F島的核電站,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 44,612評(píng)論 3 348
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 35,022評(píng)論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 36,297評(píng)論 1 292
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 52,093評(píng)論 3 397
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 48,330評(píng)論 2 377

推薦閱讀更多精彩內(nèi)容