亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

Flutter學(xué)習(xí)之Navigator的高級用法分享

 更新時間:2023年02月27日 15:40:13   作者:程序那些事  
這篇文章主要為大家詳細(xì)介紹了Flutter中之Navigator的高級用法的相關(guān)知識,文中的示例代碼講解詳細(xì),具有一定的學(xué)習(xí)價值,感興趣的可以了解一下

簡介

上篇文章我們講到了flutter中navigator的基本用法,我們可以使用它的push和pop方法來進行Router之間的跳轉(zhuǎn)。

在flutter中一個Router就是一個widget,但是在Android中,一個Router就是Activity,在IOS中,一個Router是一個ViewController。

Router除了之前講過的push和pop方法之外,還有一些更加高級的用法,一起來看看吧。

named routes

雖然在flutter中navigator將routers以stack的形式進行存儲,能做的也只是push和pop操作,但是事實上Router是可以有名字的。

想想也是,如果Router沒有名字的話,那么如何順利進行跳轉(zhuǎn)呢?不可能每次都new一個Router出來吧。

navigator有一個方法叫做Navigator.pushNamed()用來將帶名字的Router壓入堆棧,我們來看下它的定義:

  static Future<T?> pushNamed<T extends Object?>(
    BuildContext context,
    String routeName, {
    Object? arguments,
  }) {
    return Navigator.of(context).pushNamed<T>(routeName, arguments: arguments);
  }

這個方法需要傳入一個context和對應(yīng)的routeName,同時還可以帶一些參數(shù)。

那么怎么用這個方法呢?

首先我們需要定義一些Router,比如說在創(chuàng)建MaterialApp的時候可以傳入routes參數(shù),來設(shè)置named Routers:

MaterialApp(
  title: '這是named Routers',
  initialRoute: '/firstPage',
  routes: {
    '/firstPage': (context) => const FirstPage(),
    '/secondPage': (context) => const SecondPage(),
  },
)

上面的代碼中我們分別定了兩個routers,分別是firstPage和secondPage,他們分別對應(yīng)一個自定義的widget。

定義好Router之后,我們就可以向下面這樣使用了:

onPressed: () {
  Navigator.pushNamed(context, '/secondPage');
}

如果要返回第一個頁面的話,那么可以調(diào)用Navigator.pop方法來實現(xiàn):

onPressed: () {
  Navigator.pop(context);
}

給named route傳參數(shù)

在上一節(jié)我們講到pushNamed的時候,還介紹了它還可以接收參數(shù)arguments。從定義上可以看到arguments的類型是Object對象,也就是說任何對象都可以作為named route的參數(shù)。

那么我們先定義一個對象如下:

class TestArguments {
  final String name;
  final String description;

  TestArguments(this.name, this.description);
}

接下來我們需要創(chuàng)建一個能夠接受這個參數(shù)的Routers。

因為所有的Routers都是Widget,所以我們需要創(chuàng)建一個Widget,并在這個widget內(nèi)部接收傳入的參數(shù)。

在flutter中有兩種傳遞參數(shù)的方式,你可以使用ModalRoute.of(),也可以使用onGenerateRoute()。

我們先來看下ModalRoute.of的定義:

  static ModalRoute<T>? of<T extends Object?>(BuildContext context) {
    final _ModalScopeStatus? widget = context.dependOnInheritedWidgetOfExactType<_ModalScopeStatus>();
    return widget?.route as ModalRoute<T>?;
  }

它接收一個context參數(shù),然后返回一個route對象。

具體的用法如下:

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

  static const routeName = '/firstPage';

  @override
  Widget build(BuildContext context) {

    final args = ModalRoute.of(context)!.settings.arguments as TestArguments;

    return Scaffold(
      appBar: AppBar(
        title: Text(args.name),
      ),
      body: Center(
        child: Text(args.description),
      ),
    );
  }
}

除了使用ModalRoute之外,還可以在onGenerateRoute()方法中進行參數(shù)傳遞。onGenerateRoute是在Route生成的時候觸發(fā)的:

MaterialApp(

  onGenerateRoute: (settings) {
   
    if (settings.name == FirstPage.routeName) {
 
      final args = settings.arguments as TestArguments;

      return MaterialPageRoute(
        builder: (context) {
          return TestArguments(
            title: args.title,
            message: args.message,
          );
        },
      );
    }
    return null;
  },
)

onGenerateRoute接收一個settings對象,我們需要在settings對象中設(shè)置對應(yīng)的name和arguments屬性。所以我們需要這樣調(diào)用:

    Navigator.pushNamed(
      context,
      FirstPage.routeName,
      arguments: TestArguments(
        '測試',
        '這是一個named Route',
      ),
    );

從Screen返回值

有時候我們需要從一個Screen返回到之前的Screen,并且不是簡單的返回,我們還希望知道前一個screen返回了什么結(jié)果,然后可以根據(jù)前一個screen返回的不同結(jié)果來進行不同的處理。

這個時候就需要用到Navigator.pop的傳參功能了。

比如我們在第一個頁面中點擊了按鈕,跳轉(zhuǎn)到第二個頁面:

  final result = await Navigator.push(
      context,
      MaterialPageRoute(builder: (context) => const SecondScreen()),
    );

這里我們使用到了Navigator.push方法,并且返回了一個result的值。

我們可以使用這個值來進行一些邏輯判斷。

那么這個result的值是哪里傳遞過來的呢?

沒錯,就是SecondScreen中的Navigator.pop方法:

Navigator.pop(context, 'Yes');

這里的'Yes'就會傳遞給result供我們進行邏輯判斷。

向Screen傳值

有時候我們需要在頁面跳轉(zhuǎn)的過程中傳遞一些參數(shù),那么怎么才能實現(xiàn)Screen之間的參數(shù)傳遞呢?

因為在flutter中所有的Routers都是Widget,所以我們可以在跳轉(zhuǎn)到新的頁面的時候直接將參數(shù)以構(gòu)造函數(shù)的方式傳遞給Routers Widget。

比如我們有下面的Screen Widget:

class NameScreen extends StatelessWidget {

  const NameScreen({super.key, required this.name});

  final String name;

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: const Text('NameScreen'),
      ),

      body: 
      ...
      ;
  }
}

想要傳值給它,可以在onTap方法中這樣寫:

onTap: () {
        Navigator.push(
          context,
          MaterialPageRoute(
            builder: (context) => NameScreen(name: 'what is your name?'),
          ),
        );

總結(jié)

以上就是Navigator的更加高級的用法,我們可以通過Navigator來進行數(shù)據(jù)傳遞等操作,從而實現(xiàn)更加復(fù)雜的頁面功能。

到此這篇關(guān)于Flutter學(xué)習(xí)之Navigator的高級用法分享的文章就介紹到這了,更多相關(guān)Flutter Navigator內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Android實現(xiàn)仿Windows7圖片預(yù)覽窗格效果

    Android實現(xiàn)仿Windows7圖片預(yù)覽窗格效果

    這篇文章主要為大家詳細(xì)介紹了Android實現(xiàn)仿Windows7圖片預(yù)覽窗格效果,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-12-12
  • Android登錄時密碼保護功能

    Android登錄時密碼保護功能

    這篇文章主要為大家詳細(xì)介紹了Android登錄時密碼保護功能的相關(guān)資料,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-01-01
  • Android 圖文詳解Binder進程通信底層原理

    Android 圖文詳解Binder進程通信底層原理

    Android系統(tǒng)中,多進程間的通信都是依賴于底層Binder IPC機制,Binder機制是一種RPC方案。例如:當(dāng)進程A中的Activity與進程B中的Service通信時,就使用了binder機制
    2021-10-10
  • Android控件RadioButton實現(xiàn)多選一功能

    Android控件RadioButton實現(xiàn)多選一功能

    這篇文章主要為大家詳細(xì)介紹了Android控件RadioButton實現(xiàn)多選一功能,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-08-08
  • Android內(nèi)核源碼 在Ubuntu上下載,編譯,安裝

    Android內(nèi)核源碼 在Ubuntu上下載,編譯,安裝

    本文主要介紹Android內(nèi)核源碼,想學(xué)習(xí)深入研究Android的朋友肯定要看看Android內(nèi)核知識的,這里對下載Android內(nèi)核源代碼的下載,安裝,編譯做了詳細(xì)的介紹,有興趣的小伙伴可以參考下
    2016-08-08
  • Android自定義控件之可拖動控制的圓環(huán)控制條實例代碼

    Android自定義控件之可拖動控制的圓環(huán)控制條實例代碼

    這篇文章主要介紹了Android自定義控件之可拖動控制的圓環(huán)控制條實例代碼,非常不錯,具有一定的參考借鑒價值,需要的朋友可以參考下
    2019-04-04
  • Android獲取本機各種類型文件的方法

    Android獲取本機各種類型文件的方法

    這篇文章主要為大家詳細(xì)介紹了Android獲取本機各種類型文件的方法,包括音樂、視頻、圖片、文檔等,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-08-08
  • Android自定義頂部導(dǎo)航欄控件實例代碼

    Android自定義頂部導(dǎo)航欄控件實例代碼

    這篇文章主要介紹了Android自定義頂部導(dǎo)航欄控件實例代碼,需要的朋友可以參考下
    2017-12-12
  • kotlin $ 字符串模版的使用詳解

    kotlin $ 字符串模版的使用詳解

    $ 在kotlin 中當(dāng)做字符串模版使用,作用就是在字符串里面識別自己定義的字符,這篇文章主要介紹了kotlin $ 字符串模版的使用,需要的朋友可以參考下
    2024-01-01
  • Android組件ListView列表簡單使用

    Android組件ListView列表簡單使用

    這篇文章主要為大家詳細(xì)介紹了Android組件ListView列表的簡單使用,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-02-02

最新評論