Flutter入門(6):Flutter 頁面創(chuàng)建與跳轉(zhuǎn)

1. 運(yùn)行程序

建議使用 Android Studio 進(jìn)行 flutter 編程 , Android Studio 對 dart 語法很友好莹菱。

2. 示范代碼

話不多說,先上代碼管削,代碼下載地址迎捺。如果對你有幫助的話記得給個(gè)關(guān)注流酬,代碼會根據(jù)我的 Flutter 專題不斷更新嗦董。

3. 主頁創(chuàng)建

優(yōu)雅的編程居兆,我們讓 main.dart 更清晰,代碼邏輯后置感混。先創(chuàng)建一個(gè) home.dart 文件端幼。

import 'package:flutter/material.dart';

// 這里我們預(yù)留動態(tài)更新頁面功能薯酝,使用 StatefulWidget
class FMHomeVC extends StatefulWidget {
  @override
  FMHomeState createState() => FMHomeState();
}

class FMHomeState extends State<FMHomeVC> {
  return Container(
      child: Scaffold(
        backgroundColor: Colors.white,
        appBar: AppBar(
          backgroundColor: Colors.lightBlue,
          title: Text("Home"),
        ),
        body: Center(
          child: Text("Home"),
        ),
      ),
    );
}

然后對 main.dart 進(jìn)行更改函似,使用 home.dart 文件作為主頁,注意修改 import 路徑魏割。

import 'package:flutter/material.dart';
// 此處注意修改為自己的 home.dart 路徑
import 'package:FMStudyApp/home/home.dart';


void main() {
  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  // This widget is the root of your application.
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter Demo',
      home: FMHomeVC(),
    );
  }
}

運(yùn)行程序后庭呜,如下圖滑进,第一個(gè)主頁已經(jīng)生成好了。


Home Simple.png

3. ListView 創(chuàng)建

ListView 可以說是應(yīng)用非常廣泛的控件了募谎,并且簡單實(shí)用扶关,考慮到后續(xù)要在代碼下載地址持續(xù)更新,我們就首先介紹使用 ListView数冬。

先簡單介紹一下代碼邏輯节槐。

/* 
此處代碼僅僅介紹這部分邏輯,不要復(fù)制使用拐纱,下邊會貼詳細(xì)代碼铜异。
*/
class FMHomeVC extends StatefulWidget {
  @override
 // 創(chuàng)建 State
  FMHomeState createState() => FMHomeState();
}

class FMHomeState extends State<FMHomeVC> {
  // 創(chuàng)建數(shù)據(jù)源
  var funcLists = [];

  @override
  // 重寫父類方法,頁面初始化會調(diào)用
  void initState() {
    super.initState();
   // 封裝數(shù)據(jù)初始化方法秸架,為數(shù)據(jù)源添加數(shù)據(jù)揍庄,未來也可以在這里做網(wǎng)絡(luò)請求
    initData();
  }

  void initData() {
   // 調(diào)用父類方法,會刷新頁面
    setState(() {

    });
  }

  @override
  Widget build(BuildContext context) {
    // TODO: implement build

    return Container(
      child: Scaffold(
        backgroundColor: Colors.white,
        appBar: AppBar(
          backgroundColor: Colors.lightBlue,
          title: Text("Widgets 目錄"),
        ),
        body: Center(
          child: ListView.builder(
            padding: const EdgeInsets.all(15.0),
            // 生成對應(yīng)數(shù)據(jù)源數(shù)量的 Item
            itemCount: funcLists.length,
            itemBuilder: (context, index){
              // 按照數(shù)據(jù)源對每個(gè) Item 進(jìn)行渲染
              var func = funcLists[index];
              return ListTile(
                onTap: (){
                  // 點(diǎn)擊事件东抹,在這里處理不同 Item 跳轉(zhuǎn)
                },
              );
            },
          ),
        ),
      ),
    );
  }

下邊上詳細(xì)代碼

import 'package:flutter/material.dart';

class FMHomeVC extends StatefulWidget {
  @override
  FMHomeState createState() => FMHomeState();
}

class FMHomeState extends State<FMHomeVC> {
  var funcLists = [];

  @override
  void initState() {
    super.initState();

    initData();
  }

  void initData() {
    funcLists.add({"name": "基礎(chǔ)組件", "desc": "在構(gòu)建您的第一個(gè)Flutter應(yīng)用程序之前蚂子,您絕對需要了解這些widget。"});
    funcLists.add({"name": "Material Components", "desc": "實(shí)現(xiàn)了Material Design 指南的視覺府阀、效果缆镣、motion-rich的widget。"});
    funcLists.add({"name": "Cupertino(iOS風(fēng)格的widget)", "desc": "用于當(dāng)前iOS設(shè)計(jì)語言的美麗和高保真widget试浙。"});
    funcLists.add({"name": "Layout", "desc": "排列其它widget的columns董瞻、rows、grids和其它的layouts。"});
    funcLists.add({"name": "Text", "desc": "文本顯示和樣式钠糊。"});
    funcLists.add({"name": "Assets挟秤、圖片、Icons", "desc": "管理assets, 顯示圖片和Icon抄伍。"});
    funcLists.add({"name": "Input", "desc": "Material Components 和 Cupertino中獲取用戶輸入的widget艘刚。"});
    funcLists.add({"name": "動畫和Motion", "desc": "在您的應(yīng)用中使用動畫。查看Flutter中的動畫總覽截珍。"});
    funcLists.add({"name": "交互模型", "desc": "響應(yīng)觸摸事件并將用戶路由到不同的頁面視圖(View)攀甚。"});
    funcLists.add({"name": "樣式", "desc": "管理應(yīng)用的主題,使應(yīng)用能夠響應(yīng)式的適應(yīng)屏幕尺寸或添加填充岗喉。"});
    funcLists.add({"name": "繪制和效果", "desc": "Widget將視覺效果應(yīng)用到其子組件秋度,而不改變它們的布局、大小和位置钱床。"});
    funcLists.add({"name": "Async", "desc": "Flutter應(yīng)用的異步模型荚斯。"});
    funcLists.add({"name": "滾動", "desc": "滾動一個(gè)擁有多個(gè)子組件的父組件。"});
    funcLists.add({"name": "輔助功能", "desc": "給你的App添加輔助功能(這是一個(gè)正在進(jìn)行的工作)查牌。"});

    print(funcLists);

    setState(() {

    });
  }

  @override
  Widget build(BuildContext context) {
    // TODO: implement build

    return Container(
      child: Scaffold(
        backgroundColor: Colors.white,
        appBar: AppBar(
          backgroundColor: Colors.lightBlue,
          title: Text("Widgets 目錄"),
        ),
        body: Center(
          child: ListView.builder(
            padding: const EdgeInsets.all(15.0),
            itemCount: funcLists.length,
            itemBuilder: (context, index){
              var func = funcLists[index];
              return ListTile(
                contentPadding: const EdgeInsets.all(10.0),
                title: Text(
                  "${func["name"]}",
                  style: TextStyle(
                    fontSize: 20,
                    color: Colors.black,
                  ),
                ),
                subtitle: Text(
                  "${func["desc"]}",
                  style: TextStyle(
                    fontSize: 15,
                    color: Colors.grey,
                  ),
                ),
                onTap: (){
                  Navigator.push(
                    context,
                    MaterialPageRoute(builder: (context) {
                      return FMHomeVC();
                    }),
                  );
                },
              );
            },
          ),
        ),
      ),
    );
  }

運(yùn)行效果如下圖


Home ListView.png

點(diǎn)擊跳轉(zhuǎn)后如下圖


Push ListView.png

4. 技術(shù)小結(jié)

  • dart 文件的創(chuàng)建事期、引用以及使用
    其實(shí)新的文件創(chuàng)建很重要,從接觸過的很多語言開發(fā)來看纸颜,項(xiàng)目入口還是盡可能要簡潔兽泣。
    在 main.dart 中,我們 import package:PATH/home.dart 胁孙,并且在 MyApp 中將 FMHomeVC() 設(shè)置為 home撞叨。

  • StateflulWidget 的使用與創(chuàng)建
    這里不多贅述,網(wǎng)上很多講解浊洞,可以理解為頁面為動態(tài)的,便于刷新頁面胡岔。例如淘寶首頁法希,沒有網(wǎng)絡(luò)進(jìn)去可能會沒有商品,但是網(wǎng)絡(luò)請求完成后靶瘸,按照網(wǎng)絡(luò)數(shù)據(jù)需要刷新頁面苫亦,就需要使用到 StatefulWidget了。
    StatefulWidget 主要功能都集中在 State 的創(chuàng)建和邏輯處理怨咪,然后在 State 類中執(zhí)行 setState((){})方法屋剑,可以 reload 頁面,非常的簡單方便诗眨。

  • ListView 的創(chuàng)建與使用
    ListView 其實(shí)是一個(gè)非常常用的組件唉匾,大部分表單頁面和滾動視圖都是使用 ListView 完成的。
    主要注意 ListView.builder() 方法中的 itemCount、itemBuilder 兩個(gè)key巍膘。itemCount 負(fù)責(zé)生成多少行 item 厂财,itemBuilder 負(fù)責(zé)給對應(yīng)行生成對應(yīng)的 item。

  • 字典取值
    本文中的 funcLists 為數(shù)組峡懈,數(shù)組中添加的每個(gè)元素都是字典璃饱。
    然后 func = funcList[index] 取出每一個(gè)字典,然后 func["name"]肪康、func["desc"] 取出對應(yīng) Key 的值荚恶,賦值給每個(gè) item。"{func["name"]}" 這種寫法 "{var}" 為字符串中添加變量磷支。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末谒撼,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子齐唆,更是在濱河造成了極大的恐慌嗤栓,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,734評論 6 505
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件箍邮,死亡現(xiàn)場離奇詭異茉帅,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)锭弊,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,931評論 3 394
  • 文/潘曉璐 我一進(jìn)店門堪澎,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人味滞,你說我怎么就攤上這事樱蛤。” “怎么了剑鞍?”我有些...
    開封第一講書人閱讀 164,133評論 0 354
  • 文/不壞的土叔 我叫張陵昨凡,是天一觀的道長。 經(jīng)常有香客問我蚁署,道長便脊,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,532評論 1 293
  • 正文 為了忘掉前任光戈,我火速辦了婚禮哪痰,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘久妆。我一直安慰自己晌杰,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,585評論 6 392
  • 文/花漫 我一把揭開白布筷弦。 她就那樣靜靜地躺著肋演,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上惋啃,一...
    開封第一講書人閱讀 51,462評論 1 302
  • 那天哼鬓,我揣著相機(jī)與錄音,去河邊找鬼边灭。 笑死异希,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的绒瘦。 我是一名探鬼主播称簿,決...
    沈念sama閱讀 40,262評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼惰帽!你這毒婦竟也來了憨降?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,153評論 0 276
  • 序言:老撾萬榮一對情侶失蹤该酗,失蹤者是張志新(化名)和其女友劉穎授药,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體呜魄,經(jīng)...
    沈念sama閱讀 45,587評論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡悔叽,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,792評論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了爵嗅。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片娇澎。...
    茶點(diǎn)故事閱讀 39,919評論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖睹晒,靈堂內(nèi)的尸體忽然破棺而出趟庄,到底是詐尸還是另有隱情,我是刑警寧澤伪很,帶...
    沈念sama閱讀 35,635評論 5 345
  • 正文 年R本政府宣布戚啥,位于F島的核電站,受9級特大地震影響锉试,放射性物質(zhì)發(fā)生泄漏虑鼎。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,237評論 3 329
  • 文/蒙蒙 一键痛、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧匾七,春花似錦絮短、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,855評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春席里,著一層夾襖步出監(jiān)牢的瞬間叔磷,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,983評論 1 269
  • 我被黑心中介騙來泰國打工奖磁, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留改基,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,048評論 3 370
  • 正文 我出身青樓咖为,卻偏偏與公主長得像秕狰,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個(gè)殘疾皇子躁染,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,864評論 2 354