Flutter 初探

Flutter是一款移動(dòng)應(yīng)用程序SDK颊糜,一份代碼可以同時(shí)生成iOS和Android兩個(gè)高性能哩治、高保真的應(yīng)用程序,媲美原生應(yīng)用的性能衬鱼,是Google新操作系統(tǒng)Fuchsia的默認(rèn)開發(fā)套件锚扎。

一、 配置環(huán)境

  1. Android Studio 下載插件Dart馁启、Flutter
  2. 下載Flutter SDK,配置環(huán)境

二、 第一個(gè)Flutter項(xiàng)目

  1. File ->new->new Flutter Project
  2. lib->main.dart替換成以下代碼
import 'package:flutter/material.dart';

void main() => runApp(new MyApp());

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return new MaterialApp(
      title: 'Welcome to Flutter',
      //Scaffold包含appBar惯疙、title翠勉、body相當(dāng)于一個(gè)activity
      home: new Scaffold(
        appBar: new AppBar(
          title: new Text('Welcome to Flutter'),
        ),
        //內(nèi)容
        body: new Center(
          child: new Text('Hello World'),
        ),
      ),
    );
  }
}

運(yùn)行后時(shí)hello world

  1. 使用外部包(package)
    pubspec.yaml是flutter的配置文件,用于管理包和配置flutter信息(等同于build.gradle)霉颠。
dependencies:
  flutter:
    sdk: flutter
  cupertino_icons: ^0.1.2
  //添加english_words依賴对碌,指定版本號(hào)
  english_words: ^3.1.0

單擊右上角的 Packages get,這會(huì)將依賴包安裝到您的項(xiàng)目
下面就可以在main.dart中使用english_words了

import 'package:english_words/english_words.dart';
final wordPair = new WordPair.random();
// build時(shí)隨機(jī)生成單詞
child: new Text(wordPair.asPascalCase),

點(diǎn)擊熱重載按鍵更新正在運(yùn)行的應(yīng)用程序

二蒿偎、Flutter的交互

1朽们、添加有狀態(tài)的Widget
上面的StatelessWidget是不可變的, 它們的屬性值都是final的
對(duì)應(yīng)的Statefulwidgets則是可變的,它們的屬性值在widget生命周期中都是可以改變的诉位。
實(shí)現(xiàn)一個(gè) stateful widget 至少需要兩個(gè)類:

  • 一個(gè) StatefulWidget類骑脱。
  • 一個(gè) State類。 StatefulWidget類本身是不變的苍糠,但是 State類在widget生命周期中始終存在.
class RandomWords extends StatefulWidget {
  //創(chuàng)建狀態(tài)
  @override
  createState() => new RandomWordsState();
}
//狀態(tài)類
class RandomWordsState extends State<RandomWords> {
}

2叁丧、創(chuàng)建一個(gè)無限滾動(dòng)ListView

class RandomWordsState extends State<RandomWords> {
  //變量以下劃線(_)開頭,在Dart語言中使用下劃線前綴標(biāo)識(shí)符岳瞭,會(huì)強(qiáng)制其變成私有的
  final _suggestions = <WordPair>[];

  //集合存儲(chǔ)用戶喜歡(收藏)的單詞對(duì)
  final _saved = new Set<WordPair>();

  final _biggerFont = const TextStyle(fontSize: 18.0);

  @override
  Widget build(BuildContext context) {
    return new Scaffold(
      appBar: new AppBar(
        title: new Text('Startup Name Generator'),
      ),
      body: _buildSuggestions(),
    );
  }

  Widget _buildSuggestions() {
    return new ListView.builder(
        padding: const EdgeInsets.all(16.0),
        // 對(duì)于每個(gè)建議的單詞對(duì)都會(huì)調(diào)用一次itemBuilder拥娄,然后將單詞對(duì)添加到ListTile行中
        // 在偶數(shù)行,該函數(shù)會(huì)為單詞對(duì)添加一個(gè)ListTile row.
        // 在奇數(shù)行瞳筏,該行書湖添加一個(gè)分割線widget稚瘾,來分隔相鄰的詞對(duì)。
        // 注意姚炕,在小屏幕上摊欠,分割線看起來可能比較吃力。
        itemBuilder: (context, i) {
          // 在每一列之前钻心,添加一個(gè)1像素高的分隔線widget
          if (i.isOdd) return new Divider();

          // 語法 "i ~/ 2" 表示i除以2凄硼,但返回值是整形(向下取整),比如i為:1, 2, 3, 4, 5
          // 時(shí)捷沸,結(jié)果為0, 1, 1, 2, 2摊沉, 這可以計(jì)算出ListView中減去分隔線后的實(shí)際單詞對(duì)數(shù)量
          final index = i ~/ 2;
          // 如果是建議列表中最后一個(gè)單詞對(duì)
          if (index >= _suggestions.length) {
            // ...接著再生成10個(gè)單詞對(duì),然后添加到建議列表
            _suggestions.addAll(generateWordPairs().take(10));
          }
          return _buildRow(_suggestions[index]);
        });
  }

  Widget _buildRow(WordPair pair) {
    //檢查確保單詞對(duì)還沒有添加到收藏夾
    final alreadySaved = _saved.contains(pair);

    return new ListTile(
      title: new Text(
        pair.asPascalCase,
        style: _biggerFont,
      ),

      //尾部添加icon
      trailing: new Icon(
        alreadySaved ? Icons.favorite : Icons.favorite_border,
        color: alreadySaved ? Colors.red : null,
      ),

      //添加交互痒给,輕點(diǎn)監(jiān)聽
      onTap: () {
        setState(() {
          if (alreadySaved) {
            _saved.remove(pair);
          } else {
            _saved.add(pair);
          }
        });
      },

    );
  }

3说墨、創(chuàng)建可點(diǎn)擊的的List
(1)添加保持狀態(tài)集合

class RandomWordsState extends State<RandomWords> {
  //添加保持狀態(tài)集合
  final _saved = new Set<WordPair>();
  ...
}

(2)ListTile中的trailing設(shè)置尾部icon,onTap設(shè)置點(diǎn)擊事件監(jiān)聽

  Widget _buildRow(WordPair pair) {
    //檢查確保單詞對(duì)還沒有添加到收藏夾
    final alreadySaved = _saved.contains(pair);

    return new ListTile(
      title: new Text(
        pair.asPascalCase,
        style: _biggerFont,
      ),

      //后面添加icon
      trailing: new Icon(
        alreadySaved ? Icons.favorite : Icons.favorite_border,
        color: alreadySaved ? Colors.red : null,
      ),

      //添加交互苍柏,輕點(diǎn)監(jiān)聽
      onTap: () {
        setState(() {
          if (alreadySaved) {
            _saved.remove(pair);
          } else {
            _saved.add(pair);
          }
        });
      },

    );
  }

通過上面的例子尼斧,我們懂得如何Widget去創(chuàng)建的我們的頁(yè)面,保持widget的狀態(tài)试吁,并實(shí)現(xiàn)對(duì)應(yīng)交互棺棵,接下來我們學(xué)習(xí)如何在不同的頁(yè)面間跳轉(zhuǎn)

三楼咳、導(dǎo)航到新的頁(yè)面

1、Flutter中頁(yè)面叫做頁(yè)面路由烛恤,分為主路由和新路由
Navigator通過路由棧來管理各個(gè)路由頁(yè)面母怜,Navigator push一個(gè)路由頁(yè)面時(shí),App會(huì)顯示這個(gè)路由頁(yè)面缚柏,Navigator pop時(shí)苹熏,App將顯示上一個(gè)頁(yè)面。
下面代碼為push一個(gè)頁(yè)面的操作币喧。

void _pushSaved() {
  Navigator.of(context).push(
    //創(chuàng)建一個(gè)新的頁(yè)面
    new MaterialPageRoute(
      //構(gòu)建頁(yè)面內(nèi)容
      builder: (context) {
        //創(chuàng)建list
        final tiles = _saved.map(
          (pair) {
            return new ListTile(
              title: new Text(
                pair.asPascalCase,
                style: _biggerFont,
              ),
            );
          },
        );

        final divided = ListTile
          .divideTiles(
            context: context,
            tiles: tiles,
          )
          .toList();
        // 創(chuàng)建頁(yè)面內(nèi)容:一個(gè)包含喜歡集合的listView
        return new Scaffold(
          appBar: new AppBar(
            title: new Text('Saved Suggestions'),
          ),
          body: new ListView(children: divided),
        );
      },

    ),
  );
}

四轨域、Flutter Widget概述

Flutter有兩種Widget

  • 基礎(chǔ) Widget :TextRow杀餐、 Column

  • Material Widget 干发,可幫助您構(gòu)建遵循Material Design的應(yīng)用程序

五、與React Native對(duì)比

1怜浅、React Native使用HTML+JavaScript渲染成原生控件

  • 優(yōu)點(diǎn):可以完全繼承現(xiàn)代Web開發(fā)的所有成果

  • 缺點(diǎn):將渲染工作交交給系統(tǒng)铐然,雖然同樣使用類HTML+JS的UI構(gòu)建邏輯,但是最終會(huì)生成對(duì)應(yīng)的自定義原生控件恶座,導(dǎo)致框架本身需要處理大量平臺(tái)相關(guān)的邏輯搀暑,隨著系統(tǒng)版本變化和API的變化,開發(fā)者可能也需要處理不同平臺(tái)的差異跨琳。

2自点、Flutter有什么優(yōu)勢(shì)胧瓜?

  • 提高開發(fā)效率
    同一份代碼開發(fā)iOS和Android
    用更少的代碼做更多的事情
    輕松迭代
    ??在應(yīng)用程序運(yùn)行時(shí)更改代碼并重新加載(通過熱重載疚漆,不需要重啟APP,很快)
    ??修復(fù)崩潰并繼續(xù)從應(yīng)用程序停止的地方進(jìn)行調(diào)試

  • 創(chuàng)建美觀筷弦,高度定制的用戶體驗(yàn)
    受益于使用Flutter框架提供的豐富的Material Design和Cupertino(iOS風(fēng)格)的widget
    實(shí)現(xiàn)定制溅潜、美觀术唬、品牌驅(qū)動(dòng)的設(shè)計(jì),而不受原生控件的限制

Flutter則開辟了一種全新的思路滚澜,從頭到尾重寫一套跨平臺(tái)的UI框架粗仓,包括UI控件、渲染邏輯甚至開發(fā)語言设捐。渲染引擎依靠跨平臺(tái)的Skia圖形庫(kù)來實(shí)現(xiàn)借浊,依賴系統(tǒng)的只有圖形繪制相關(guān)的接口,可以在最大程度上保證不同平臺(tái)萝招、不同設(shè)備的體驗(yàn)一致性蚂斤,邏輯處理使用支持AOT的Dart語言,執(zhí)行效率也比JavaScript高得多槐沼。

六曙蒸、Flutter學(xué)習(xí)資料

Flutter中文網(wǎng)站
https://flutterchina.club/get-started/install/
Flutter GitHub
https://github.com/flutter/flutter
Flutter examples
https://github.com/flutter/flutter/tree/master/examples

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末捌治,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子逸爵,更是在濱河造成了極大的恐慌具滴,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,941評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件师倔,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡周蹭,警方通過查閱死者的電腦和手機(jī)趋艘,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,397評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來凶朗,“玉大人瓷胧,你說我怎么就攤上這事∨锓撸” “怎么了搓萧?”我有些...
    開封第一講書人閱讀 165,345評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)宛畦。 經(jīng)常有香客問我瘸洛,道長(zhǎng),這世上最難降的妖魔是什么次和? 我笑而不...
    開封第一講書人閱讀 58,851評(píng)論 1 295
  • 正文 為了忘掉前任反肋,我火速辦了婚禮,結(jié)果婚禮上踏施,老公的妹妹穿的比我還像新娘石蔗。我一直安慰自己,他們只是感情好畅形,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,868評(píng)論 6 392
  • 文/花漫 我一把揭開白布养距。 她就那樣靜靜地躺著,像睡著了一般日熬。 火紅的嫁衣襯著肌膚如雪棍厌。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,688評(píng)論 1 305
  • 那天碍遍,我揣著相機(jī)與錄音定铜,去河邊找鬼。 笑死怕敬,一個(gè)胖子當(dāng)著我的面吹牛揣炕,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播东跪,決...
    沈念sama閱讀 40,414評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼畸陡,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼鹰溜!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起丁恭,我...
    開封第一講書人閱讀 39,319評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤曹动,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后牲览,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體墓陈,經(jīng)...
    沈念sama閱讀 45,775評(píng)論 1 315
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,945評(píng)論 3 336
  • 正文 我和宋清朗相戀三年第献,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了贡必。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,096評(píng)論 1 350
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡庸毫,死狀恐怖仔拟,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情飒赃,我是刑警寧澤利花,帶...
    沈念sama閱讀 35,789評(píng)論 5 346
  • 正文 年R本政府宣布,位于F島的核電站载佳,受9級(jí)特大地震影響炒事,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜刚盈,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,437評(píng)論 3 331
  • 文/蒙蒙 一羡洛、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧藕漱,春花似錦欲侮、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,993評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至橄仍,卻和暖如春韧涨,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背侮繁。 一陣腳步聲響...
    開封第一講書人閱讀 33,107評(píng)論 1 271
  • 我被黑心中介騙來泰國(guó)打工虑粥, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人宪哩。 一個(gè)月前我還...
    沈念sama閱讀 48,308評(píng)論 3 372
  • 正文 我出身青樓娩贷,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親锁孟。 傳聞我的和親對(duì)象是個(gè)殘疾皇子彬祖,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,037評(píng)論 2 355

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

  • 本文主要大致介紹Flutter 整體框架茁瘦,簡(jiǎn)單粗略的使用,深度暫且還沒有储笑。用Dart甜熔,寫了個(gè)計(jì)算器的demo和列表...
    空而小sao閱讀 1,984評(píng)論 0 0
  • 最新消息 Flutter在12月5號(hào)發(fā)布了最新的穩(wěn)定版本1.0,象征著Flutter新技術(shù)提上了征程,期待著他能靠...
    納蘭寒明閱讀 1,713評(píng)論 0 1
  • 特別說明 當(dāng)前博客平臺(tái)賬號(hào)已廢棄突倍,如果有使用細(xì)節(jié)問題請(qǐng)前往我新博客平臺(tái)進(jìn)行討論交流腔稀。 個(gè)人博客平臺(tái) HuRuWo的...
    善篤有余劫閱讀 4,953評(píng)論 0 30
  • 如果你還在猶豫為什么要學(xué)Flutter,下面2個(gè)圖的應(yīng)該足夠吸引你加入了吧羽历,一套代碼多平臺(tái)使用 Flutter 是...
    jzhu085閱讀 6,900評(píng)論 7 62
  • 想想就好了烧颖,不要打擾,過一會(huì)兒就好了
    大獅子一聲喵閱讀 242評(píng)論 0 0