欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

一文詳解如何在Flutter中使用導(dǎo)航Navigator

 更新時間:2023年02月20日 16:01:28   作者:程序那些事  
一個APP如果沒有頁面跳轉(zhuǎn)那么是沒有靈魂的,頁面跳轉(zhuǎn)的一個常用說法就是Navigator。那么在flutter中如何使用Navigator呢?本文就來和大家詳細(xì)聊聊

簡介

一個APP如果沒有頁面跳轉(zhuǎn)那么是沒有靈魂的,頁面跳轉(zhuǎn)的一個常用說法就是Navigator,flutter作為一個最為優(yōu)秀的前端框架,Navigator肯定是必不可少的,那么在flutter中如何使用Navigator呢?

一起來看看吧。

flutter中的Navigator

Navigator是flutter中用來導(dǎo)航的關(guān)鍵組件。我們先來看下Navigator的定義:

class Navigator extends StatefulWidget

Navigator首先是一個StatefulWidget,為什么是一個有狀態(tài)的widget呢?這是因為Navigator需要在內(nèi)部報錯一些路由的信息,事實上Navigator中保存的就是一個棧結(jié)構(gòu)的歷史訪問過的widget。

我們來看下它的構(gòu)造函數(shù),然后理解一下它內(nèi)部的各個屬性的含義:

  const Navigator({
    Key? key,
    this.pages = const <Page<dynamic>>[],
    this.onPopPage,
    this.initialRoute,
    this.onGenerateInitialRoutes = Navigator.defaultGenerateInitialRoutes,
    this.onGenerateRoute,
    this.onUnknownRoute,
    this.transitionDelegate = const DefaultTransitionDelegate<dynamic>(),
    this.reportsRouteUpdateToEngine = false,
    this.observers = const <NavigatorObserver>[],
    this.restorationScopeId,
  })

在這些屬性中onGenerateRoute,pages,onGenerateInitialRoutes,transitionDelegate和observers這幾個參數(shù)必須是非null。

首先是pages,pages是一個List對象:

  final List<Page<dynamic>> pages;

這里的pages存儲的就是歷史訪問信息,Navigator的所有操作都是圍繞著pages來的。

如果我們想在page切換的過程中添加一些動畫,那么就可以用到transitionDelegate,如果我們要彈出一些page的話,那么可能會希望用到onPopPage callback方法來對pages list進(jìn)行一些特殊處理。

另外initialRoute是需要第一個展示的route,Navigator還提供了兩個方法用來在生成Route的時候進(jìn)行觸發(fā):onGenerateRoute,onGenerateInitialRoutes。

Navigator提供了一系列的pop和push方法用來對路由進(jìn)行跳轉(zhuǎn)。

下面我們將會通過一個具體的例子來對Navigator進(jìn)行詳細(xì)的講解。

Navigator的使用

在這個例子中我們會使用Navigator的兩個最基本的方法push和pop來進(jìn)行路由的切換。

先來看下push方法的定義:

  static Future<T?> push<T extends Object?>(BuildContext context, Route<T> route) {
    return Navigator.of(context).push(route);
  }

push是一個靜態(tài)方法,這意味著我們可以通過使用Navigator.push來進(jìn)行調(diào)用。

push方法需要傳入兩個參數(shù),分別是context和route。

為什么會有context呢?這是因為Navigator是和context相關(guān)聯(lián)的,不同的context可以有不同的Navigator。

Route就是要導(dǎo)入的路由。

可以看到方法內(nèi)部實際上是調(diào)用了Navigator.of方法,最后返回的是一個Future對象。

我們的例子是兩個圖片widget的簡單切換。點擊一個圖像widget會調(diào)整到另外一個圖像widget上,在另外一個圖像widget上點擊,會跳轉(zhuǎn)回前一個widget。

我們可以這樣定義第一個widget:

class FirstPage extends StatelessWidget {
  const FirstPage({Key? key}) : super(key: key);

  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: const Text('First Page'),
      ),
      body: GestureDetector(
        onTap: () {
          Navigator.push(context, MaterialPageRoute(builder: (context) {
            return const SecondPage();
          }));
        },
        child: Image.network(
          'http://www.flydean.com/wp-content/uploads/2019/06/cropped-head5.jpg',
        ),
      ),
    );
  }

這里的body我們放置了一個Image對象,然后在它的點擊onTap操作時,調(diào)用了Navigator.push方法。

因為push方法需要一個Route對象,這里我們使用了最簡單的MaterialPageRoute,然后返回第二個圖像widget對象。

再來看看第二個圖像Widget的定義:

class SecondPage extends StatelessWidget {
  const SecondPage({Key? key}) : super(key: key);

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      body: GestureDetector(
        onTap: () {
          Navigator.pop(context);
        },
        child: Center(
          child: Image.network(
            'https://img-blog.csdnimg.cn/bb5b19255ab6406cb6bdc467ecc40462.webp',
          ),
        ),
      ),
    );
  }
}

和第一個圖像widget一樣,它的body也是一個image,然后在點擊ontap方法中跳回到第一個圖片widget去。

這里的跳回方法使用的是 Navigator.pop,我們來看下pop方法的實現(xiàn):

  static void pop<T extends Object?>(BuildContext context, [ T? result ]) {
    Navigator.of(context).pop<T>(result);
  }

和push一樣,pop方法也接收一個context對象,但是它還有一個可選的result參數(shù)。最后實際調(diào)用的是Navigator.of(context).pop方法。

result是做什么的呢?

還記得push方法嗎?push方法會返回一個Future,也就是說push方法是有結(jié)果的,這個結(jié)果是從哪里來的呢?這個結(jié)果就是pop時候傳進(jìn)來的。

當(dāng)我們調(diào)用push方法的時候,就會把這個result放在Future中返回。

運行上面的代碼,首先我們得到第一個頁面的widget:

點擊就會調(diào)整到第二個圖片widget:

再次點擊就會跳回第一個頁面,非常的神奇。

總結(jié)

Navigator是每個flutter app都少不了的組件,希望大家能夠掌握。

本文的例子:https://github.com/ddean2009/learn-flutter.git

到此這篇關(guān)于一文詳解如何在Flutter中使用導(dǎo)航Navigator的文章就介紹到這了,更多相關(guān)Flutter使用導(dǎo)航Navigator內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Android性能優(yōu)化之ViewPagers?+?Fragment緩存優(yōu)化

    Android性能優(yōu)化之ViewPagers?+?Fragment緩存優(yōu)化

    這篇文章主要介紹了Android性能優(yōu)化之ViewPagers+Fragment緩存優(yōu)化,文章圍繞主題展開詳細(xì)的內(nèi)容介紹,具有一定的參考價值,需要的小伙伴可以參考一下
    2022-08-08
  • 詳解android 人臉檢測你一定會遇到的坑

    詳解android 人臉檢測你一定會遇到的坑

    這篇文章主要介紹了詳解android 人臉檢測你一定會遇到的坑,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-11-11
  • Android使用ViewPager實現(xiàn)啟動引導(dǎo)頁

    Android使用ViewPager實現(xiàn)啟動引導(dǎo)頁

    這篇文章主要為大家詳細(xì)介紹了Android使用ViewPager實現(xiàn)第一次啟動引導(dǎo)頁,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2016-07-07
  • RxRetroHttp為多套API請求適配而生

    RxRetroHttp為多套API請求適配而生

    今天小編就為大家分享一篇關(guān)于RxRetroHttp為多套API請求適配而生,小編覺得內(nèi)容挺不錯的,現(xiàn)在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧
    2019-02-02
  • Flutter交互并使用小工具管理其狀態(tài)widget的state詳解

    Flutter交互并使用小工具管理其狀態(tài)widget的state詳解

    這篇文章主要為大家介紹了Flutter交互并使用小工具管理其狀態(tài)widget的state詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-12-12
  • Android 數(shù)據(jù)庫打包隨APK發(fā)布的實例代碼

    Android 數(shù)據(jù)庫打包隨APK發(fā)布的實例代碼

    有些時候我們的軟件用到SQLite數(shù)據(jù)庫,這個時候怎么把一個做好的數(shù)據(jù)庫打包進(jìn)我們的APK呢
    2013-10-10
  • android實現(xiàn)圖片橡皮擦和快速染色功能

    android實現(xiàn)圖片橡皮擦和快速染色功能

    這篇文章主要為大家詳細(xì)介紹了android實現(xiàn)圖片橡皮擦和快速染色功能,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2018-12-12
  • Android后臺線程和UI線程通訊實例

    Android后臺線程和UI線程通訊實例

    這篇文章主要介紹了Android后臺線程和UI線程通訊實例,每一步的要點和步驟都有提及,并配有代碼例子,需要的朋友可以參考下
    2014-06-06
  • textView 添加超鏈接(兩種實現(xiàn)方式)

    textView 添加超鏈接(兩種實現(xiàn)方式)

    在textView添加超鏈接,有兩種方式,第一種通過HTML格式化你的網(wǎng)址,一種是設(shè)置autolink,讓系統(tǒng)自動識別超鏈接,下面為大家介紹下這兩種方法的實現(xiàn)
    2013-06-06
  • Android自定義彈框樣式

    Android自定義彈框樣式

    這篇文章主要為大家詳細(xì)介紹了Android自定義彈框樣式,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2020-08-08

最新評論