您好,登錄后才能下訂單哦!
本篇內容介紹了“Flutter之Navigator的高級用法有哪些”的有關知識,在實際案例的操作過程中,不少人都會遇到這樣的困境,接下來就讓小編帶領大家學習一下如何處理這些情況吧!希望大家仔細閱讀,能夠學有所成!
雖然在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); }
在上一節我們講到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返回的不同結果來進行不同的處理。
這個時候就需要用到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之間的參數傳遞呢?
因為在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?'), ), );
“Flutter之Navigator的高級用法有哪些”的內容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業相關的知識可以關注億速云網站,小編將為大家輸出更多高質量的實用文章!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。