flutter中的命名路由
命名路由是區(qū)別于基本路由的一種存在慨蓝,方便于大型項(xiàng)目中路由的統(tǒng)一管理秸滴,現(xiàn)在雹嗦,在前面基本路由的項(xiàng)目基礎(chǔ)上實(shí)現(xiàn)實(shí)現(xiàn)命名路由啥酱。
使用步驟
路由配置
命名路由在使用前冠跷,需要在根組件main.dart中進(jìn)行簡單的配置(前面是頁面路徑南誊,后面是頁面中的組件名稱):
image
image
main.dart
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(),
}
);
}
}
路由跳轉(zhuǎn)
路由配置完成以后,在需要進(jìn)行路由跳轉(zhuǎn)的地方直接輸入上面配置的名稱使用就可以了(從Home.dart中跳轉(zhuǎn)到Search.dart)蜜托。
image
Home.dart
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("跳轉(zhuǎn)到搜索頁面"),
onPressed: () { //路由跳轉(zhuǎn)
Navigator.pushNamed(context, '/search');
},
color: Theme.of(context).accentColor,
textTheme: ButtonTextTheme.primary
),
SizedBox(height: 20),
],
);
}
}
路由模塊化
在vue和react中抄囚,為了方便管理大量的路由,通常是采用路由模塊化來處理橄务,在flutter中幔托,也可以使用路由模塊化來處理大量的命名路由。
為了現(xiàn)在路由模塊化蜂挪,首先需要在lib目錄下重挑,新建routes文件夾,在該文件夾下新建Routes.dart頁面棠涮;然后將前面的路由配置移入到該文件中谬哀。
Routes.dart
import 'package:flutter/material.dart';
import '../pages/Tabs.dart';
import '../pages/Form.dart';
import '../pages/Search.dart';//配置路由
final routes={ '/':(context)=>Tabs(), '/form':(context)=>FormPage(),'/search':(context,{arguments})=>SearchPage(arguments:arguments),
}; //固定寫法
var onGenerateRoute=(RouteSettings settings) { // 統(tǒng)一處理
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中引入這個(gè)頁面就可以了。
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: '/', //初始化的時(shí)候加載的路由
onGenerateRoute: onGenerateRoute
);
}
}
命名路由傳參(從Home.dart頁面跳轉(zhuǎn)到Search.dart頁面)
在上面的Routes.dart頁面中严肪,多了一個(gè)onGenerateRoute的變量史煎,這個(gè)是命名路由傳參的固定寫法谦屑。在命名路由中傳參的時(shí)候,除了需要添加前面說到的變量篇梭,還需要完成以下操作:
1氢橙,配置路由時(shí),配置可選參數(shù)
image
2恬偷,路由跳轉(zhuǎn)前的頁面中悍手,寫入需要傳遞的可選參數(shù)
image
Home.dart
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("跳轉(zhuǎn)到搜索頁面"),
onPressed: () { //路由跳轉(zhuǎn)
Navigator.pushNamed(context, '/search',arguments: { "id":123 });
},
color: Theme.of(context).accentColor,
textTheme: ButtonTextTheme.primary
),
],
);
}
}
3,在路由跳轉(zhuǎn)后的頁面中喉磁,接收傳遞的參數(shù)
image
Search.dart
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("搜索頁面內(nèi)容區(qū)域${arguments != null ? arguments['id'] : '0'}"),
);
}
}
代碼下載:點(diǎn)這里(k9bg)