一文詳解如何在Flutter中使用導航Navigator
簡介
一個APP如果沒有頁面跳轉那么是沒有靈魂的,頁面跳轉的一個常用說法就是Navigator,flutter作為一個最為優(yōu)秀的前端框架,Navigator肯定是必不可少的,那么在flutter中如何使用Navigator呢?
一起來看看吧。
flutter中的Navigator
Navigator是flutter中用來導航的關鍵組件。我們先來看下Navigator的定義:
class Navigator extends StatefulWidget
Navigator首先是一個StatefulWidget,為什么是一個有狀態(tài)的widget呢?這是因為Navigator需要在內部報錯一些路由的信息,事實上Navigator中保存的就是一個棧結構的歷史訪問過的widget。
我們來看下它的構造函數,然后理解一下它內部的各個屬性的含義:
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這幾個參數必須是非null。
首先是pages,pages是一個List對象:
final List<Page<dynamic>> pages;
這里的pages存儲的就是歷史訪問信息,Navigator的所有操作都是圍繞著pages來的。
如果我們想在page切換的過程中添加一些動畫,那么就可以用到transitionDelegate,如果我們要彈出一些page的話,那么可能會希望用到onPopPage callback方法來對pages list進行一些特殊處理。
另外initialRoute是需要第一個展示的route,Navigator還提供了兩個方法用來在生成Route的時候進行觸發(fā):onGenerateRoute,onGenerateInitialRoutes。
Navigator提供了一系列的pop和push方法用來對路由進行跳轉。
下面我們將會通過一個具體的例子來對Navigator進行詳細的講解。
Navigator的使用
在這個例子中我們會使用Navigator的兩個最基本的方法push和pop來進行路由的切換。
先來看下push方法的定義:
static Future<T?> push<T extends Object?>(BuildContext context, Route<T> route) {
return Navigator.of(context).push(route);
}push是一個靜態(tài)方法,這意味著我們可以通過使用Navigator.push來進行調用。
push方法需要傳入兩個參數,分別是context和route。
為什么會有context呢?這是因為Navigator是和context相關聯(lián)的,不同的context可以有不同的Navigator。
Route就是要導入的路由。
可以看到方法內部實際上是調用了Navigator.of方法,最后返回的是一個Future對象。
我們的例子是兩個圖片widget的簡單切換。點擊一個圖像widget會調整到另外一個圖像widget上,在另外一個圖像widget上點擊,會跳轉回前一個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操作時,調用了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參數。最后實際調用的是Navigator.of(context).pop方法。
result是做什么的呢?
還記得push方法嗎?push方法會返回一個Future,也就是說push方法是有結果的,這個結果是從哪里來的呢?這個結果就是pop時候傳進來的。
當我們調用push方法的時候,就會把這個result放在Future中返回。
運行上面的代碼,首先我們得到第一個頁面的widget:

點擊就會調整到第二個圖片widget:

再次點擊就會跳回第一個頁面,非常的神奇。
總結
Navigator是每個flutter app都少不了的組件,希望大家能夠掌握。
本文的例子:https://github.com/ddean2009/learn-flutter.git
到此這篇關于一文詳解如何在Flutter中使用導航Navigator的文章就介紹到這了,更多相關Flutter使用導航Navigator內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
Android基于Toolbar實現(xiàn)頂部標題欄及后退鍵
這篇文章主要介紹了Android基于Toolbar實現(xiàn)頂部標題欄及后退鍵,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下2020-09-09
深入剖析Android系統(tǒng)中Service和IntentService的區(qū)別
這篇文章主要介紹了Android系統(tǒng)中Service和IntentService的區(qū)別,與普通的服務相比,IntentService可以開啟單獨的線程來處理intent請求,需要的朋友可以參考下2016-04-04
Android ExpandableListView用法示例詳解
ExpandableListView 是 Android 中一個非常實用的列表控件,它可以幫助我們實現(xiàn)具有分組功能的列表展示,通過本文的介紹,你應該已經掌握了 ExpandableListView 的基本用法,感興趣的朋友跟隨小編一起看看吧2025-02-02

