当前位置: 首页 > news >正文

Flutter路由使用指南

主要有两种方式:基本路由命名路由

1. 基本路由

使用 Navigator.push 和 Navigator.pop

import 'package:flutter/material.dart';// 首页
class HomePage extends StatelessWidget {@overrideWidget build(BuildContext context) {return Scaffold(appBar: AppBar(title: Text('首页')),body: Center(child: ElevatedButton(onPressed: () {// 导航到第二个页面Navigator.push(context,MaterialPageRoute(builder: (context) => SecondPage()),);},child: Text('去第二个页面'),),),);}
}// 第二个页面
class SecondPage extends StatelessWidget {@overrideWidget build(BuildContext context) {return Scaffold(appBar: AppBar(title: Text('第二个页面')),body: Center(child: ElevatedButton(onPressed: () {// 返回上一个页面Navigator.pop(context);},child: Text('返回'),),),);}
}

带参数的路由

// 详情页面,接收参数
class DetailPage extends StatelessWidget {final String itemId;final String itemName;DetailPage({required this.itemId, required this.itemName});@overrideWidget build(BuildContext context) {return Scaffold(appBar: AppBar(title: Text('详情页面')),body: Center(child: Column(mainAxisAlignment: MainAxisAlignment.center,children: [Text('ID: $itemId'),Text('名称: $itemName'),ElevatedButton(onPressed: () => Navigator.pop(context),child: Text('返回'),),],),),);}
}// 使用方式
Navigator.push(context,MaterialPageRoute(builder: (context) => DetailPage(itemId: '123',itemName: '示例商品',),),
);

2. 命名路由

配置路由表

void main() {runApp(MyApp());
}class MyApp extends StatelessWidget {@overrideWidget build(BuildContext context) {return MaterialApp(title: '命名路由示例',// 定义路由表routes: {'/': (context) => HomePage(),'/second': (context) => SecondPage(),'/detail': (context) => DetailPage(), // 注意:这种方式不能传递参数},// 或者使用 onGenerateRoute 来处理带参数的路由onGenerateRoute: (settings) {if (settings.name == '/detail') {final args = settings.arguments as Map<String, String>;return MaterialPageRoute(builder: (context) => DetailPage(itemId: args['id']!,itemName: args['name']!,),);}return null;},);}
}

使用命名路由导航

// 简单的命名路由
Navigator.pushNamed(context, '/second');// 带参数的命名路由
Navigator.pushNamed(context,'/detail',arguments: {'id': '123','name': '示例商品',},
);

3. 路由返回值

从页面返回数据

class SelectionPage extends StatelessWidget {@overrideWidget build(BuildContext context) {return Scaffold(appBar: AppBar(title: Text('选择页面')),body: Center(child: Column(children: [ElevatedButton(onPressed: () {// 返回数据Navigator.pop(context, '选项A');},child: Text('选择A'),),ElevatedButton(onPressed: () {Navigator.pop(context, '选项B');},child: Text('选择B'),),],),),);}
}// 在主页面接收返回值
void _navigateToSelection(BuildContext context) async {final result = await Navigator.push(context,MaterialPageRoute(builder: (context) => SelectionPage()),);// 处理返回结果if (result != null) {print('用户选择了: $result');}
}

4. 路由守卫

使用 onGenerateRoute 进行权限控制

class MyApp extends StatelessWidget {final bool isLoggedIn = false; // 模拟登录状态@overrideWidget build(BuildContext context) {return MaterialApp(onGenerateRoute: (settings) {// 路由守卫 - 检查登录状态if (settings.name == '/profile' && !isLoggedIn) {// 未登录时重定向到登录页面return MaterialPageRoute(builder: (context) => LoginPage(),);}// 正常路由处理switch (settings.name) {case '/':return MaterialPageRoute(builder: (context) => HomePage());case '/profile':return MaterialPageRoute(builder: (context) => ProfilePage());case '/login':return MaterialPageRoute(builder: (context) => LoginPage());default:return MaterialPageRoute(builder: (context) => NotFoundPage(),);}},);}
}

总结

  • 基本路由:适合简单的导航场景

  • 命名路由:适合复杂的应用结构,便于管理

  • 参数传递:可以通过构造函数或路由参数传递

  • 返回值:使用 await 等待页面返回结果

  • 路由守卫:通过 onGenerateRoute 实现权限控制

http://www.dtcms.com/a/524034.html

相关文章:

  • husky vs lefthook:新一代 Git Hooks 工具全面对比
  • Go Web 编程快速入门 07 - 模板(1):语法与最佳实践
  • 聊城网站建设信息兴义网站建设网站建设
  • 今年前三季度浙江进出口总值首破四万亿元
  • 【一文了解】八大排序-插入排序、希尔排序
  • n8n数据存储在postgres
  • 数据结构——冒泡排序
  • 医疗连续体机器人模块化控制界面设计(2025年更新版Python库)
  • 做网站服务器需要系统wordpress折腾怕了
  • 022数据结构之树状数组——算法备赛
  • 从 TypeScript 到 Java(4):访问修饰符与作用域 —— Java 的封装哲学
  • 做网站要有什么团队上海网站营销推广
  • 残差网络的介绍及ResNet-18的搭建(pytorch版)
  • WPF绘制界面常用功能
  • vbs笔记 【未完更】
  • 不用服务器也能搭博客!Docsify+cpolar的极简方案
  • 一文了解开源大语言模型文件结构,以 Hugging Face DeepSeek-V3.1 模型仓库为例
  • 艾体宝洞察 | CRA 合规冲刺指南:艾体宝 ONEKEY 独家报告首发,洞察全球企业合规进度!
  • 网站设计方法常州网站制作维护
  • iOS 26 App 开发阶段性能优化 从多工具协作到数据驱动的实战体系
  • Nginx 配置解析与性能优化
  • vLLM 性能优化实战:批处理、量化与缓存配置方案
  • 【前端】前端浏览器性能优化的小方法
  • google广告联盟网站服务平台型网站
  • Android GPU的RenderThread Texture upload上传Bitmap优化prepareToDraw
  • 10.1 网络规划与设计——结构化布线系统
  • 国产麒麟、uos在线编辑数据库中的文件
  • 从零开始的C++学习生活 15:哈希表的使用和封装unordered_map/set
  • 【图像处理基石】通过立体视觉重建建筑高度:原理、实操与代码实现
  • 金融培训网站源码国内可以做的国外兼职网站