Flutter(八):Flutter路由管理(Router)

来源:https://www.cnblogs.com/anywherego/archive/2022/10/25/16824814.html
-Advertisement-
Play Games

一、術語 路由(route): 在 Flutter 中,屏 (screen) 和 頁面 (page) 都叫做 路由 (route)。 在 Android 開發中,Activity 相當於“路由”,在 iOS 開發中,ViewController 相當於“路由”。在 Flutter 中,“路由”也是一 ...


目錄

一、術語

路由(route)

  • 在 Flutter 中,屏 (screen) 和 頁面 (page) 都叫做 路由 (route)。
  • 在 Android 開發中,Activity 相當於“路由”,在 iOS 開發中,ViewController 相當於“路由”。在 Flutter 中,“路由”也是一個 widget。

導航(Navigator):

  • Navigator是一個路由管理的組件,它提供了打開和退出路由頁方法。Navigator官方鏈接
  • Navigator常用的路由管理方法包括pushpop

二、路由管理

1、Navigator示例代碼

import 'package:flutter/material.dart';

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

class MyApp extends StatelessWidget {
  const MyApp({super.key});

  // This widget is the root of your application.
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
        title: 'Flutter Demo',
        theme: ThemeData(
          primarySwatch: Colors.blue,
        ),
        routes: {
          '/': (context) => const HomePage(),
          '/second': (context) => const SecondScreen(),
        });
  }
}

/// 第一個頁面
class HomePage extends StatelessWidget {
  const HomePage({super.key});

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: const Text('Home'),
      ),
      body: Center(
        child: Column(
          children: [
            ElevatedButton(
              onPressed: () {
                Navigator.push(context, MaterialPageRoute(
                    builder: (context) => const SecondScreen(),
                  ),
                );
              },
              child: const Text('使用Navigator+構造器跳轉'),
            ),
            ElevatedButton(
              onPressed: () {
                Navigator.pushNamed(context, '/second');
              },
              child: const Text('使用Navigator+命名路由跳轉'),
            ),
          ],
        ),
      ),
    );
  }
}

/// 第二個頁面
class SecondScreen extends StatelessWidget {
  const SecondScreen({super.key});

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: const Text('Second Screen'),
      ),
      body: Center(
        child: ElevatedButton(
          onPressed: () {
            Navigator.pop(context);
          },
          child: const Text('Go back!'),
        ),
      ),
    );
  }
}

2、路由定義(命名路由)

在App中定義router:

routes: {
          '/': (context) => const HomePage(),
          '/second': (context) => const SecondScreen(),
        }

3、Navigator方法介紹

1.Navigator.push

  • push(BuildContext context, Route route)

將給定的路由入棧(即打開新的頁面),返回值是一個Future對象,用以接收新路由出棧(即關閉)時的返回數據。

  • pushNamed(BuildContext context, String routeName, {Object? arguments,})

將給定的路由名入棧,返回值是一個Future對象,用以接收新路由出棧(即關閉)時的返回數據。

2.Navigor.pop

  • pop(BuildContext context, [ T? result ])

將棧頂路由出棧,result為頁面關閉時返回給上一個頁面的數據

3.其他

Navigator還有很多其他方法,如Navigator.replaceNavigator.popUntil等,具體參考Navigator官方鏈接

3、路由傳值

示例代碼

定義傳值Model

class DetailInfo {
  final String title;
  final String message;
  final String? other;

  DetailInfo(this.title, this.message,{this.other});
}

使用pushNamed傳遞數據

Navigator.pushNamed(context, '/second', arguments: DetailInfo('詳情頁','返回'));

獲取數據

使用MaterialPageRoute中的ModalRoute來獲取路由參數,註意要避空

final detail = ModalRoute.of(context)?.settings.arguments as DetailInfo?;

完整代碼:

class SecondScreen extends StatelessWidget {
  const SecondScreen({super.key});

  @override
  Widget build(BuildContext context) {

    final detail = ModalRoute.of(context)?.settings.arguments as DetailInfo?;

    return Scaffold(
      appBar: AppBar(
        title: Text(detail?.title ?? ''),
      ),
      body: Center(
        child: ElevatedButton(
          onPressed: () {
            Navigator.pop(context);
          },
          child: Text(detail?.message ?? ''),
        ),
      ),
    );
  }
}

4、其他

1.返回到指定頁面

Navigator.popUntil(context, ModalRoute.withName('/'));

2.跳轉指定頁面,並銷毀當前頁

Navigator.pushReplacementNamed(context, '/third');

3.推出當前頁,然後跳轉指定頁

會有一個推出的動畫效果

Navigator.popAndPushNamed(context, '/third');

您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • sersync: sersync類似於inotify,同樣用於監控,但它剋服了inotify的缺點. inotify+rsync 缺點: 一個操作可能會產生重覆的事件,這樣可能會觸發rsync的多次同步。 serync特點: 基於inotify基礎上開發而來的。 sersync的作用: 用來替代in ...
  • 文件定時同步的實現: 利用rsync結合cron計劃任務實現: rsync -av --delete /data/ 10.0.0.12:/back -a:保留文件屬性 -v:顯示過程 -delete:如果源文件沒有的,目標文件裡面有,就把目標文件裡面的刪除掉 文件實時同步的實現: 前提: 文件發生髮 ...
  • 本文主要描述企業用戶如何從阿裡雲市場購買、使用石原子公司的AtomData企業級實時數倉產品。 1、購買 1.1 找到商品 通過阿裡雲官網的雲市場類目進入雲市場首頁,搜索AtomData,即可發現產品,如下圖。 1.2 選擇規格 點擊雲市場的商品,進入AtomData商品詳情頁,在商品詳情頁可以選擇 ...
  • 本文主要描述用戶如何從阿裡雲市場購買、使用石原子公司的StoneDB(HTAP)資料庫產品。 1、購買 1.1 找到商品 通過阿裡雲官網的雲市場類目進入雲市場首頁,搜索StoneDB,即可發現產品,如下圖: 1.2 選擇規格 點擊雲市場的商品,進入StoneDB商品詳情頁,在商品詳情頁可以選擇需要購 ...
  • GreatSQL社區原創內容未經授權不得隨意使用,轉載請聯繫小編並註明來源。 GreatSQL是MySQL的國產分支版本,使用上與MySQL一致。 前情提要 當前讀 快照讀 什麼是MVCC 三個隱藏欄位 Undo Log回滾日誌 MVCC版本鏈 ReadView讀視圖 不同隔離級別下MVCC分析 R ...
  • 報名地址:https://www.bagevent.com/event/8322877 2022年,世界正在改變,開源創造價值。已經辦到第七屆的開源年會首次來到杭州與開發者們相聚。你眼中的開源是怎樣的?對於開源你有沒有想要講述的? 「開源」對於很多人而言,其存在的意義早就不止在於源代碼的開放彙集,更 ...
  • 3.1 SQL概述: SQL:結構化查詢語言,是關係資料庫的標準語言,SQL是一個通用的、功能極強的關係資料庫語言 結構化查詢:理解:就是只要告訴資料庫我要乾什麼,怎麼乾就可以了 3.1.2 SQL的特點: 綜合統一: 集數據定義語言 DDL,數據操縱語言 DML,數據控制語言 DCL功能於一體, ...
  • 首發微信公眾號:SQL資料庫運維 原文鏈接:https://mp.weixin.qq.com/s?__biz=MzI1NTQyNzg3MQ==&mid=2247485212&idx=1&sn=450e9e94fa709b5eeff0de371c62072b&chksm=ea37536cdd40da7 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...