網站首頁 編程語言 正文
簡介
上篇文章我們講到了flutter中navigator的基本用法,我們可以使用它的push和pop方法來進行Router之間的跳轉。
在flutter中一個Router就是一個widget,但是在Android中,一個Router就是Activity,在IOS中,一個Router是一個ViewController。
Router除了之前講過的push和pop方法之外,還有一些更加高級的用法,一起來看看吧。
named routes
雖然在flutter中navigator將routers以stack的形式進行存儲,能做的也只是push和pop操作,但是事實上Router是可以有名字的。
想想也是,如果Router沒有名字的話,那么如何順利進行跳轉呢?不可能每次都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和對應的routeName,同時還可以帶一些參數。
那么怎么用這個方法呢?
首先我們需要定義一些Router,比如說在創建MaterialApp的時候可以傳入routes參數,來設置named Routers:
MaterialApp(
title: '這是named Routers',
initialRoute: '/firstPage',
routes: {
'/firstPage': (context) => const FirstPage(),
'/secondPage': (context) => const SecondPage(),
},
)
上面的代碼中我們分別定了兩個routers,分別是firstPage和secondPage,他們分別對應一個自定義的widget。
定義好Router之后,我們就可以向下面這樣使用了:
onPressed: () {
Navigator.pushNamed(context, '/secondPage');
}
如果要返回第一個頁面的話,那么可以調用Navigator.pop方法來實現:
onPressed: () {
Navigator.pop(context);
}
給named route傳參數
在上一節我們講到pushNamed的時候,還介紹了它還可以接收參數arguments。從定義上可以看到arguments的類型是Object對象,也就是說任何對象都可以作為named route的參數。
那么我們先定義一個對象如下:
class TestArguments {
final String name;
final String description;
TestArguments(this.name, this.description);
}
接下來我們需要創建一個能夠接受這個參數的Routers。
因為所有的Routers都是Widget,所以我們需要創建一個Widget,并在這個widget內部接收傳入的參數。
在flutter中有兩種傳遞參數的方式,你可以使用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參數,然后返回一個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()方法中進行參數傳遞。onGenerateRoute是在Route生成的時候觸發的:
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對象中設置對應的name和arguments屬性。所以我們需要這樣調用:
Navigator.pushNamed(
context,
FirstPage.routeName,
arguments: TestArguments(
'測試',
'這是一個named Route',
),
);
從Screen返回值
有時候我們需要從一個Screen返回到之前的Screen,并且不是簡單的返回,我們還希望知道前一個screen返回了什么結果,然后可以根據前一個screen返回的不同結果來進行不同的處理。
這個時候就需要用到Navigator.pop的傳參功能了。
比如我們在第一個頁面中點擊了按鈕,跳轉到第二個頁面:
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傳值
有時候我們需要在頁面跳轉的過程中傳遞一些參數,那么怎么才能實現Screen之間的參數傳遞呢?
因為在flutter中所有的Routers都是Widget,所以我們可以在跳轉到新的頁面的時候直接將參數以構造函數的方式傳遞給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?'),
),
);
總結
以上就是Navigator的更加高級的用法,我們可以通過Navigator來進行數據傳遞等操作,從而實現更加復雜的頁面功能。
原文鏈接:https://juejin.cn/post/7204715616284049465
- 上一篇:沒有了
- 下一篇:沒有了
相關推薦
- 2023-02-04 基于Python的GUI圖形用戶界面編程詳細講解_python
- 2022-12-01 Flutter路由框架Fluro使用教程詳細講解_Android
- 2022-06-17 C語言深入講解棧與堆和靜態存儲區的使用_C 語言
- 2024-02-16 SpringBoot 事務的屬性rollbackFor 與 propagetion
- 2023-06-13 react拖拽組件react-sortable-hoc的使用_React
- 2022-01-28 Mybatis技術內幕-設計模式與應用場景總結
- 2022-03-08 Asp.NetCore3.1開源項目升級為.Net6.0的方法實現_實用技巧
- 2022-07-21 安裝MiniConda和Pytorch以及Cuda的筆記及心得
- 欄目分類
-
- 最近更新
-
- window11 系統安裝 yarn
- 超詳細win安裝深度學習環境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權
- redisson分布式鎖中waittime的設
- maven:解決release錯誤:Artif
- restTemplate使用總結
- Spring Security之安全異常處理
- MybatisPlus優雅實現加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務發現-Nac
- Spring Security之基于HttpR
- Redis 底層數據結構-簡單動態字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應用詳解
- 聊聊消息隊列,發送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支