您好,登錄后才能下訂單哦!
本篇內(nèi)容主要講解“怎么在Flutter中使用導(dǎo)航Navigator”,感興趣的朋友不妨來看看。本文介紹的方法操作簡單快捷,實用性強(qiáng)。下面就讓小編來帶大家學(xué)習(xí)“怎么在Flutter中使用導(dǎo)航Navigator”吧!
一個APP如果沒有頁面跳轉(zhuǎn)那么是沒有靈魂的,頁面跳轉(zhuǎn)的一個常用說法就是Navigator,flutter作為一個最為優(yōu)秀的前端框架,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的兩個最基本的方法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中返回。
到此,相信大家對“怎么在Flutter中使用導(dǎo)航Navigator”有了更深的了解,不妨來實際操作一番吧!這里是億速云網(wǎng)站,更多相關(guān)內(nèi)容可以進(jìn)入相關(guān)頻道進(jìn)行查詢,關(guān)注我們,繼續(xù)學(xué)習(xí)!
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。