一、術語 路由(route): 在 Flutter 中,屏 (screen) 和 頁面 (page) 都叫做 路由 (route)。 在 Android 開發中,Activity 相當於“路由”,在 iOS 開發中,ViewController 相當於“路由”。在 Flutter 中,“路由”也是一 ...
目錄
一、術語
路由(route)
:
- 在 Flutter 中,屏 (screen) 和 頁面 (page) 都叫做 路由 (route)。
- 在 Android 開發中,Activity 相當於“路由”,在 iOS 開發中,ViewController 相當於“路由”。在 Flutter 中,“路由”也是一個 widget。
導航(Navigator)
:
Navigator
是一個路由管理的組件,它提供了打開和退出路由頁方法。Navigator官方鏈接Navigator
常用的路由管理方法包括push
和pop
二、路由管理
1、Navigator示例代碼
import 'package:flutter/material.dart';
void main() => runApp(const MyApp());
class MyApp extends StatelessWidget {
const MyApp({super.key});
// This widget is the root of your application.
@override
Widget build(BuildContext context) {
return MaterialApp(
title: 'Flutter Demo',
theme: ThemeData(
primarySwatch: Colors.blue,
),
routes: {
'/': (context) => const HomePage(),
'/second': (context) => const SecondScreen(),
});
}
}
/// 第一個頁面
class HomePage extends StatelessWidget {
const HomePage({super.key});
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: const Text('Home'),
),
body: Center(
child: Column(
children: [
ElevatedButton(
onPressed: () {
Navigator.push(context, MaterialPageRoute(
builder: (context) => const SecondScreen(),
),
);
},
child: const Text('使用Navigator+構造器跳轉'),
),
ElevatedButton(
onPressed: () {
Navigator.pushNamed(context, '/second');
},
child: const Text('使用Navigator+命名路由跳轉'),
),
],
),
),
);
}
}
/// 第二個頁面
class SecondScreen extends StatelessWidget {
const SecondScreen({super.key});
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: const Text('Second Screen'),
),
body: Center(
child: ElevatedButton(
onPressed: () {
Navigator.pop(context);
},
child: const Text('Go back!'),
),
),
);
}
}
2、路由定義(命名路由)
在App中定義router:
routes: {
'/': (context) => const HomePage(),
'/second': (context) => const SecondScreen(),
}
3、Navigator方法介紹
1.Navigator.push
push(BuildContext context, Route route)
將給定的路由入棧(即打開新的頁面),返回值是一個Future對象,用以接收新路由出棧(即關閉)時的返回數據。
pushNamed(BuildContext context, String routeName, {Object? arguments,})
將給定的路由名入棧,返回值是一個Future對象,用以接收新路由出棧(即關閉)時的返回數據。
2.Navigor.pop
- pop(BuildContext context, [ T? result ])
將棧頂路由出棧,result為頁面關閉時返回給上一個頁面的數據
3.其他
Navigator
還有很多其他方法,如Navigator.replace
、Navigator.popUntil
等,具體參考Navigator官方鏈接
3、路由傳值
示例代碼
定義傳值Model
class DetailInfo {
final String title;
final String message;
final String? other;
DetailInfo(this.title, this.message,{this.other});
}
使用pushNamed
傳遞數據
Navigator.pushNamed(context, '/second', arguments: DetailInfo('詳情頁','返回'));
獲取數據
使用MaterialPageRoute
中的ModalRoute
來獲取路由參數,註意要避空
final detail = ModalRoute.of(context)?.settings.arguments as DetailInfo?;
完整代碼:
class SecondScreen extends StatelessWidget {
const SecondScreen({super.key});
@override
Widget build(BuildContext context) {
final detail = ModalRoute.of(context)?.settings.arguments as DetailInfo?;
return Scaffold(
appBar: AppBar(
title: Text(detail?.title ?? ''),
),
body: Center(
child: ElevatedButton(
onPressed: () {
Navigator.pop(context);
},
child: Text(detail?.message ?? ''),
),
),
);
}
}
4、其他
1.返回到指定頁面
Navigator.popUntil(context, ModalRoute.withName('/'));
2.跳轉指定頁面,並銷毀當前頁
Navigator.pushReplacementNamed(context, '/third');
3.推出當前頁,然後跳轉指定頁
會有一個推出的動畫效果
Navigator.popAndPushNamed(context, '/third');