Flutter路由
2025-11-25
一、引言
在Android开发中,多页面间的跳转通常通过Activity实现,每个Activity代表一个独立界面。不同界面之间的参数传递可借助Intent完成,当然也存在其他实现方式。由于本文重点讨论Flutter框架,此处不对Android相关机制展开阐述。那么,在Flutter中如何实现类似的路由效果呢?
首先,Flutter中与Activity相对应的概念是Page,但需要明确的是,Page本质上仍属于Widget的一种,可理解为一种特殊类型的界面组件。在具体实现上,页面的打开与关闭操作通过Navigator类提供的push、pushNamed及pop等方法完成。其底层原理在于,绝大多数操作系统中的页面管理均基于栈结构实现:页面跳转对应将新页面压入栈顶,而关闭页面则是将栈顶页面弹出。在这一机制上,Flutter与Android的设计思路是一致的,并无本质区别。
二、简单实例
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!'),
),
),
);
}
}可以看到,第二个页面和第一个页面类的申明方法一模一样都是通过继承StatelessWidget类来实现的,当然你也可以继承StatefulWidget,所以它们本质上就是一个Widget

同时在容器那一层咱们自定义一个路由关系表,定义这个你就可以通过pushNamed进行打开新的page,如果不定义就只能通过push进行打开,而且push是直接push一个类名,说实话这在编程体系中真的很不方便,pushNamed可以自定义page名称更加符合人类习惯

具体打开的方法是如下的,所以你可以看到其实pushNamed感觉更加符合代码编写习惯

三、数据传递
很多时候,新开一个page需要把之前page通过业务逻辑处理出来的一些数据给传递过去,Flutter中消息传递可以通过pushNamed方法实现,多加一个参数就好了

那么如何接受传过去的参数呢?这里记住要做空检查,不然容易NPE,太糟心了

然而很多时候,我们也需要在界面销毁的时候传递参数,所以pop也是可以传递参数的,首先我们需要在push界面的时候申明一个返回值变量,然后去等待返回值,再做检查,注意NPE

然后我们只需要在第二个界面执行pop方法的时候给予一个返回值就可以了,当然你也可以用json或者自定义类进行返回这个都是看你自己

发表评论: