Flutter入門(6):Flutter 頁面創建與跳轉

1. 運行程序

建議使用 Android Studio 進行 flutter 編程 , Android Studio 對 dart 語法很友好。

2. 示范代碼

話不多說,先上代碼,代碼下載地址。如果對你有幫助的話記得給個關注,代碼會根據我的 Flutter 專題不斷更新。

3. 主頁創建

優雅的編程,我們讓 main.dart 更清晰,代碼邏輯后置。先創建一個 home.dart 文件。

import 'package:flutter/material.dart';

// 這里我們預留動態更新頁面功能,使用 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 進行更改,使用 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(),
    );
  }
}

運行程序后,如下圖,第一個主頁已經生成好了。


Home Simple.png

3. ListView 創建

ListView 可以說是應用非常廣泛的控件了,并且簡單實用,考慮到后續要在代碼下載地址持續更新,我們就首先介紹使用 ListView。

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

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

class FMHomeState extends State<FMHomeVC> {
  // 創建數據源
  var funcLists = [];

  @override
  // 重寫父類方法,頁面初始化會調用
  void initState() {
    super.initState();
   // 封裝數據初始化方法,為數據源添加數據,未來也可以在這里做網絡請求
    initData();
  }

  void initData() {
   // 調用父類方法,會刷新頁面
    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),
            // 生成對應數據源數量的 Item
            itemCount: funcLists.length,
            itemBuilder: (context, index){
              // 按照數據源對每個 Item 進行渲染
              var func = funcLists[index];
              return ListTile(
                onTap: (){
                  // 點擊事件,在這里處理不同 Item 跳轉
                },
              );
            },
          ),
        ),
      ),
    );
  }

下邊上詳細代碼

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": "基礎組件", "desc": "在構建您的第一個Flutter應用程序之前,您絕對需要了解這些widget。"});
    funcLists.add({"name": "Material Components", "desc": "實現了Material Design 指南的視覺、效果、motion-rich的widget。"});
    funcLists.add({"name": "Cupertino(iOS風格的widget)", "desc": "用于當前iOS設計語言的美麗和高保真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": "在您的應用中使用動畫。查看Flutter中的動畫總覽。"});
    funcLists.add({"name": "交互模型", "desc": "響應觸摸事件并將用戶路由到不同的頁面視圖(View)。"});
    funcLists.add({"name": "樣式", "desc": "管理應用的主題,使應用能夠響應式的適應屏幕尺寸或添加填充。"});
    funcLists.add({"name": "繪制和效果", "desc": "Widget將視覺效果應用到其子組件,而不改變它們的布局、大小和位置。"});
    funcLists.add({"name": "Async", "desc": "Flutter應用的異步模型。"});
    funcLists.add({"name": "滾動", "desc": "滾動一個擁有多個子組件的父組件。"});
    funcLists.add({"name": "輔助功能", "desc": "給你的App添加輔助功能(這是一個正在進行的工作)。"});

    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();
                    }),
                  );
                },
              );
            },
          ),
        ),
      ),
    );
  }

運行效果如下圖


Home ListView.png

點擊跳轉后如下圖


Push ListView.png

4. 技術小結

  • dart 文件的創建、引用以及使用
    其實新的文件創建很重要,從接觸過的很多語言開發來看,項目入口還是盡可能要簡潔。
    在 main.dart 中,我們 import package:PATH/home.dart ,并且在 MyApp 中將 FMHomeVC() 設置為 home。

  • StateflulWidget 的使用與創建
    這里不多贅述,網上很多講解,可以理解為頁面為動態的,便于刷新頁面。例如淘寶首頁,沒有網絡進去可能會沒有商品,但是網絡請求完成后,按照網絡數據需要刷新頁面,就需要使用到 StatefulWidget了。
    StatefulWidget 主要功能都集中在 State 的創建和邏輯處理,然后在 State 類中執行 setState((){})方法,可以 reload 頁面,非常的簡單方便。

  • ListView 的創建與使用
    ListView 其實是一個非常常用的組件,大部分表單頁面和滾動視圖都是使用 ListView 完成的。
    主要注意 ListView.builder() 方法中的 itemCount、itemBuilder 兩個key。itemCount 負責生成多少行 item ,itemBuilder 負責給對應行生成對應的 item。

  • 字典取值
    本文中的 funcLists 為數組,數組中添加的每個元素都是字典。
    然后 func = funcList[index] 取出每一個字典,然后 func["name"]、func["desc"] 取出對應 Key 的值,賦值給每個 item。"{func["name"]}" 這種寫法 "{var}" 為字符串中添加變量。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。