Flutter 中的路由通俗的講就是頁面跳轉。在 Flutter 中經過 Navigator 組件管理路由導航。 app
並提供了管理堆棧的方法。如:Navigator.push 和 Navigator.pop
Flutter 中給咱們提供了兩種配置路由跳轉的方式:1、基本路由 2、命名路由 less
Flutter 中的基本路由使用 ide
例如:ui
從 HomePage 組件跳轉到 SearchPage 組件 this
1、須要在 HomPage 中引入 SearchPage.dart
spa
import '../SearchPage.dart';
2、在 HomePage 中經過下面方法跳轉 code
RaisedButton( child: Text("跳轉到搜索頁面"), onPressed: () { //路由跳轉 Navigator.of(context).push( MaterialPageRoute( builder: (context)=>SearchPage() ) ); }, color: Theme.of(context).accentColor, textTheme: ButtonTextTheme.primary ),
Flutter 中的基本路由跳轉傳值 orm
import 'package:flutter/material.dart'; import '../Form.dart'; class CategoryPage extends StatefulWidget { CategoryPage({Key key}) : super(key: key); _CategoryPageState createState() => _CategoryPageState(); } class _CategoryPageState extends State<CategoryPage> { @override Widget build(BuildContext context) { return Column( crossAxisAlignment: CrossAxisAlignment.start, mainAxisAlignment: MainAxisAlignment.center, children: <Widget>[ RaisedButton( child: Text("跳轉到表單頁面"), onPressed: (){ Navigator.of(context).push( MaterialPageRoute( builder: (context)=>FormPage(title:'我是跳轉傳值') ) ); }, ) ], ); } }
Flutter 中的命名路由 blog
1、配置路由 路由
import 'package:flutter/material.dart'; import 'pages/Tabs.dart'; import 'pages/Form.dart'; import 'pages/Search.dart'; void main() => runApp(MyApp()); class MyApp extends StatelessWidget { @override Widget build(BuildContext context) { return MaterialApp( home:Tabs(), routes: { '/form':(context)=>FormPage(), '/search':(context)=>SearchPage(), } ); } }
2、路由跳轉
import 'package:flutter/material.dart'; class HomePage extends StatefulWidget { HomePage({Key key}) : super(key: key); _HomePageState createState() => _HomePageState(); } class _HomePageState extends State<HomePage> { @override Widget build(BuildContext context) { return Column( crossAxisAlignment: CrossAxisAlignment.center, mainAxisAlignment: MainAxisAlignment.center, children: <Widget>[ RaisedButton( child: Text("跳轉到搜索頁面"), onPressed: () { //路由跳轉 Navigator.pushNamed(context, '/search'); }, color: Theme.of(context).accentColor, textTheme: ButtonTextTheme.primary ), SizedBox(height: 20), ], ); } }
Flutter 中的命名路由跳轉傳值
import 'package:flutter/material.dart'; import 'pages/Tabs.dart'; import 'pages/Search.dart'; import 'pages/Form.dart'; void main() => runApp(MyApp()); class MyApp extends StatelessWidget { final routes = { '/': (contxt) => Tabs(), '/search': (contxt) => SearchPage(), '/form': (context, {arguments}) => FormPage(arguments: arguments), }; @override Widget build(BuildContext context) { return MaterialApp( home: Tabs(), onGenerateRoute: (RouteSettings settings) { // 統一處理 final String name = settings.name; final Function pageContentBuilder = this.routes[name]; if (pageContentBuilder != null) { if (settings.arguments != null) { final Route route = MaterialPageRoute( builder: (context) => pageContentBuilder(context, arguments: settings.arguments)); return route; } else { final Route route = MaterialPageRoute( builder: (context) => pageContentBuilder(context)); return route; } } }); } }
傳值
import 'package:flutter/material.dart'; class HomePage extends StatefulWidget { HomePage({Key key}) : super(key: key); _HomePageState createState() => _HomePageState(); } class _HomePageState extends State<HomePage> { @override Widget build(BuildContext context) { return Column( crossAxisAlignment: CrossAxisAlignment.center, mainAxisAlignment: MainAxisAlignment.center, children: <Widget>[ RaisedButton( child: Text("跳轉到搜索頁面"), onPressed: () { //路由跳轉 Navigator.pushNamed(context, '/search',arguments: { "id":123 }); }, color: Theme.of(context).accentColor, textTheme: ButtonTextTheme.primary ), SizedBox(height: 20), RaisedButton( child: Text("跳轉到商品頁面"), onPressed: () { Navigator.pushNamed(context, '/product'); } ), ], ); } }
接收參數:
import 'package:flutter/material.dart'; class SearchPage extends StatelessWidget { final arguments; SearchPage({this.arguments}); @override Widget build(BuildContext context) { return Scaffold( appBar:AppBar( title: Text("搜索頁面"), ) , body: Text("搜索頁面內容區域${arguments != null ? arguments['id'] : '0'}"), ); } }
Flutter 中的命名路單獨抽離
Routes.dart
import 'package:flutter/material.dart'; import '../pages/Tabs.dart'; import '../pages/Form.dart'; import '../pages/Search.dart'; import '../pages/Product.dart'; import '../pages/ProductInfo.dart'; //配置路由 final routes={ '/':(context)=>Tabs(), '/form':(context)=>FormPage(), '/product':(context)=>ProductPage(), '/productinfo':(context,{arguments})=>ProductInfoPage(arguments:arguments), '/search':(context,{arguments})=>SearchPage(arguments:arguments), }; //固定寫法 var onGenerateRoute=(RouteSettings settings) { // 統一處理 final String name = settings.name; final Function pageContentBuilder = routes[name]; if (pageContentBuilder != null) { if (settings.arguments != null) { final Route route = MaterialPageRoute( builder: (context) => pageContentBuilder(context, arguments: settings.arguments)); return route; }else{ final Route route = MaterialPageRoute( builder: (context) => pageContentBuilder(context)); return route; } } };
main.dart
import 'package:flutter/material.dart'; import 'routes/Routes.dart'; void main() => runApp(MyApp()); class MyApp extends StatelessWidget { @override Widget build(BuildContext context) { return MaterialApp( // home:Tabs(), initialRoute: '/', //初始化的時候加載的路由 onGenerateRoute: onGenerateRoute ); } }
官方文檔:https://flutter.dev/docs/cookbook/navigation/navigate-with-arguments
Flutter 中返回到上一級頁面
Navigator.of(context).pop();
Flutter 中替換路由
好比咱們從用戶中心頁面跳轉到了 registerFirst 頁面,而後從 registerFirst 頁面經過 pushReplacementNamed 跳轉到了 registerSecond 頁面。這個時候當咱們點擊 registerSecond 的返回按鈕的時候它會直接返回到用戶中心。
Navigator.of(context).pushReplacementNamed('/registerSecond');
Flutter 返回到根路由
好比咱們從用戶中心跳轉到 registerFirst 頁面,而後從 registerFirst 頁面跳轉到 registerSecond 頁面,而後從 registerSecond 跳轉到了 registerThird 頁面。這個時候咱們想的是 registerThird 註冊成功後返回到用戶中心。 這個時候就用到了返回到根路由的方法。
Navigator.of(context).pushAndRemoveUntil( new MaterialPageRoute(builder: (context) => new Tabs(index:1)), );