Flutter 路由

Flutter onGenerateRoute路由传参配置 flutter配置命名路由传递参数 import 'package:flutter/material.dart'; //import 'package:flutter_demo/provider/provider.dart'; import 'package:flutter_demo/routes/routes.dart'; //import 'package:provider/provider.dart'; void main() { //runApp(ChangeNotifierProvider( 阅读详情

前言:

路由的核心就是一个路由映射表,比如login  映射到 LoginPage,有了这样的映射,就可以根据名字去找寻对应的页面。

在Flutter 中,路由管理主要有两个类 Route 和 Navigator

一 Route

在Flutter 中,一个页面要想被理由统一管理,必须要包装为一个Route,

但是Route 本身是一个抽象类,所以是不能被实例化的

abstract class Route<T>

所以我们一般使用MaterialPageRoute,这个MaterialPageRoute也不是直接继承自Route的,

它是继承链条  PageRoute -> ModalRoute -> TransitionRoute - >OverlayRoute - > Route

对于安卓平台 ,打开一个页面是直接从底部滑动到顶部

对于苹果平台, 打开一个页面会从屏幕右侧滑动到屏幕的左侧

二 Navigator

1 基本使用

管理所有Route 的 widget,通过一个路由栈管理,也就是先进后出的结构。

  _jumpToDetail(BuildContext context) {
    Navigator.of(context).push(MaterialPageRoute(
      builder: (context) {
        return DetailPage();
      },
    ));
  }

上面的方式有缺点 ,假如我们应用中存在多个地方都要访问商品详情页面,这样写的话,代码就会重复太多了。

这种时候就可以使用 

2 命名路由

以上的方式就是一个简单的跳转,但是一般的话 我们会通过在MaterialApp 里面配置route 的方式构建路由映射表

Map<String, WidgetBuilder> this.routes = const <String, WidgetBuilder>{},

这个routes 参数就是一个Map

例如如下的方式

routes: {"/detail": (context) => DetailPage()},

那么调用的时候直接可以push 就行了

_jumpToDetail(BuildContext context) {

Navigator.of(context).pushNamed("/detail");

}

 3 传递参数

使用一个钩子函数实现传递参数 onGenerateRoute ,settings.arguments

这个函数的调用时机:

onGenerateRoute 只有没在routes中注册的路由才会被回调。

所以我们可以在这里做一些操作

 onGenerateRoute: (settings) {
        if (settings.name == "/about") {
          // 这里
          return MaterialPageRoute(
            builder: (context) {
              return AboutPage(message: settings.arguments);
            },
          );
        }
        return null;
      },

为什么采用这种方式,因为在AboutPage 中定义的有参数,那么在routes定义的时候,没有办法传入初始化的参数,所以采用这种方式。

4 举例来说一个项目中的router.dart 文件

import 'package:flutter/material.dart';
import '../pages/tabs/tab.dart';

import '../pages/tabs/home.dart';
import '../pages/tabs/category.dart';
import '../pages/tabs/user.dart';
import '../pages/tabs/cart.dart';
import '../pages/productList.dart';
import '../pages/productSearch.dart';
import '../pages/productDetail.dart';
import '../pages/login.dart';
import '../pages/login/registerFirst.dart';
import '../pages/ensureOrder/ensuerOrder.dart';
import '../pages/address/addressAdd.dart';
import '../pages/address/addressEdit.dart';
import '../pages/address/addressList.dart';
import '../pages/ensureOrder/choosePay.dart';

//配置路由
final routes = {
  '/': (context) => Tabs(),
  '/home': (context) => HomePage(),
  '/category': (context) => CategoryPage(),
  '/user': (context) => UserPage(),
  '/cart': (context) => CartPage(),
  '/productSearch': (context) => ProductSearchPage(),
  '/productDetail': (context) => ProductDetailPage(),
  '/login': (context) => LoginPage(),
  '/ensureOrder': (context) => EnsureOrderpage(),
  '/registerFirst': (context) => RegisterFirstPage(),
  '/addressAdd': (context) => AddressAddPage(),
  '/addressEdit': (context) => AddressEditPage(),
  '/addressList': (context) => AddressListPage(),
  '/choosePay': (context) => ChoosePayPage(),
  '/productList': (context, {arguments}) =>
      ProductListPage(arguments: arguments)
};

//固定写法
var onGenerateRoute = (RouteSettings settings) {
// 统一处理
  final String? name = settings.name;
  final Function pageContentBuilder = routes[name] as Function;
  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中直接使用即可:

initialRoute: "/",

onGenerateRoute: onGenerateRoute,

5 onUnknownRoute

这个方法如名字一样 ,跳转的路由未找到就会走这个方法

onUnknownRoute: (settings) {
        return MaterialPageRoute(
          builder: (context) {
            return UnkonwnPage();
          },
        );
      },

Flutter路由管理 阅读详情

相关推荐

【Flutter】Flutter 如何获取当前路由

本文介绍了如何在 Flutter 中获取当前路由,我们介绍了两种方法,一种是使用 NavigatorState 类,另一种是使用 ModalRoute 类。我们还提供了一些代码示例来帮助你理解如何在实际的应用中获取和使用当前路由。

Code Metaverse 3581

Flutter onGenerateRoute路由的用法

上官方代码看的更清楚 // Copyright 2020, the Flutter project authors. Please see the AUTHORS file // for details. All rights reserved. Use of this source code is governed by a // BSD-style license that can be found in the LICENSE file. /// Shows how to handle arbi

Leove的专栏 3888

task5:在本地搭建大模型(ollama 和 LM studio 对比),接入 openclaw

关于大模型,大家千万不要想着在本地部署,根本不可行,没有那个财力。另外大模型迭代快,不可能每周都在下载大模型。再次,还是国外的模型好用,国内的模型真的在 deepresearch 上就有很大问题,你们懂的。所以本篇文章,还是聚焦在探索层面+实操,并不会实战。

这里是 AI 食用指南,持续分享有用的AI 实操和应用! 1968

Flutter路由总结2

命名路由(基于onGenerateRoute) 以下介绍如何通过MaterialApp组件的onGenerateRoute属性来管理路由。 1. 从下面代码可以看到,我们不对MaterialApp组件的routes属性进行赋值,而是赋予了其onGenerateRoute属性一个回调函数onGenerateRoute。当查找路由的时候,发现routes属性为null,即会触发onGenerateRo...

isAlberYu的博客 839

【SABRE 3D, SABRE 3DxT,LAM设备】2025年9月12日-生产期间维护用的双重隔离

生产期间维护用的双重隔离。该程序用于准备将一个或多个双工位设置为维护状态,同时SABRE 3D/3DxT/3D Scimitar保持生产运行。其目的是在不中断生产的情况下将双工位与运行中的设备隔离。

weixin_46735260的博客 574

PCB模块化设计24——DCDC电源模块PCB布局布线设计规范

PCB模块化设计24——DCDC电源模块PCB布局布线设计规范

qq_31444421的博客 2万+

一周掌握Flutter开发--4、导航与路由

基础跳转:使用和。命名路由:使用routes和集中管理路由。路由传参和返回结果:通过arguments和await实现。推荐工具go_router支持深度链接和嵌套路由,适合复杂应用。掌握这些导航与路由的核心功能后,你可以轻松管理 Flutter 应用的页面跳转和路由逻辑。结束语Flutter是一个由Google开发的开源UI工具包,它可以让您在不同平台上创建高质量、美观的应用程序,而无需编写大量平台特定的代码。我将学习和深入研究Flutter的方方面面。

江上清风山间明月的博客 1461

微信小游戏过审实战:JS混淆与马甲包规避技巧

本文详细解析了微信小游戏过审的实战技巧,重点介绍了JS代码混淆与马甲包规避策略。通过代码混淆、资源文件处理和分阶段提审等方法,有效应对微信机审系统的代码包侵权检测,提升过审成功率。文章还分享了常见问题的解决方案和实战经验,为开发者提供实用指导。

weixin_29234423的博客 279

flutter路由配置

4、 通过命名路由配置带参数pushNamed。3、通过命名路由配置pushNamed。1、push不带参数。

datalover的专栏 519

PyTorch GPU版本安装避坑指南:解决RuntimeError: No CUDA GPUs are available报错

本文详细解析了PyTorch GPU版本安装过程中常见的`RuntimeError: No CUDA GPUs are available`报错问题,从硬件驱动检查、CUDA Toolkit与cuDNN安装到PyTorch GPU版本的正确配置,提供了全面的避坑指南和实战验证方法,帮助开发者高效搭建深度学习开发环境。

r2s3t4的博客 296

基于深度学习的AI生成式人脸图像鉴别

AIGC(AI内容生成)技术的快速发展确实为创作者提供了高效生产力工具,但同时也引发了一些问题和挑战。这些技术可以生成以假乱真的图像、视频换脸等,给不法分子提供了滥用的机会。其中,一些不法分子可能利用AIGC技术制造虚假新闻、违反版权、绕过活体身份验证、散布谣言和诽谤他人、进行敲诈勒索等非法活动,以谋取不当利益。这些行为给社会造成了严重的负面影响,破坏了信息的真实性和可信度。因此,我们需要认识到AIGC技术的潜在风险,并采取相应的措施来应对。

mingo_敏 4494

Flutter—路由

路由(Route)在移动开发中通常指页面(Page),这跟 Web 开发中单页应用的 Route 概念意义是相同的,Route 在 Android中 通常指一个 Activity,在 iOS 中指一个 ViewController。所谓路由管理,就是管理页面之间如何跳转,通常也可被称为导航管理。Flutter 中的路由管理和原生开发类似,无论是 Android 还是 iOS,导航管理都会维护一个路由栈,路由入栈(push)操作对应打开一个新页面,路由出栈(pop)操作对应页面关闭操作,而路由管理主要是指如何

大模型训练 2656

DDD系列 - 第6讲 仓库Repository - Mybatis篇

书接上回,之前通过一个关于拆解、微服务、面向对象的故事,向大家介绍了如何从微服务、面向对象一步步演进到DDD的,整个演进过程如下图:其中在领域层,我们定义了富血模型的领域模型,包括聚合、聚合根、实体、值对象等。聚合在代码层面中的表现形式即是一个包Package,起到了边界的作用,聚合内的对象间高内聚,而聚合间低耦合。聚合中放着实体、值对象、仓库等,实体相较于值对象的一个典型区别就是实体存在唯一标识,并且可通过该唯一标识查询到该实体并对其进行相关操作,值对象不存在唯一标识且通常作为实体。

罗小爬的技术宝书 1783

【Flutter】路由详解

介绍了Flutter中路由的使用。

一以贯之的努力 不得懈怠的人生 2059

【vsomeip3 教程】SOME/IP中间件去抖策略全解析

本文探讨了在SOME/IP中间件中实现Debounce(去抖动)机制的必要性和实现原理。文章首先分析了中间件层进行Debounce的四大动机:多订阅者共享收益、语义显式化、协议噪声屏蔽和入口处背压控制。接着详细阐述了Debounce的底层原理,包括变化检测机制(ignore和mask的应用)、时间门控策略(interval的两种时间基准)以及超时补发机制,并通过表格清晰展示了不同参数组合的效果和适用场景。最后,文章提出了工程落地的具体方法,包括策略选型、ignore/mask的设计方法论以及分层验证调试的实

探索C++编程的奥秘,分享深入的技术见解和实践,旨在激发读者创造力与解决问题的思维。 232

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

Flutter【路由】

文章目录基本路由传参命名路由传参路由单独模块化 在Flutter中通过Navigator组件管理路由导航。 并提供了管理堆栈的方法。如:Navigator.push和Navigator.pop 基本路由 RaisedButton( child: Text("跳转到搜索页面"), onPressed: (){ Naviga...

越思考越清晰 1268

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

Flutter系列-flutter路由管理

Flutter路由管理初识路由概念一.路由管理1.1.Route1.2.MaterialPageRoute1.3.Navigator1.4.路由传值1.5 命名路由1.6.命名路由参数传递1.7.适配二、路由钩子三、onUnknownRoute四、结尾 初识路由概念 路由的概念由来已久,包括网络路由、后端路由,到现在广为流行的前端路由。无论路由的概念如何应用,它的核心是一个路由映射表。比如:名字 detail 映射到 DetailPage 页面等。有了这个映射表之后,我们就可以方便的根据名字来完成路由的转发

路漫漫其修远兮,吾将上下而求索 7003

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

Flutter路由

Flutter路由路由基本路由的使用命名路由命名路由传值返回上一页面路由替换返回根路由 路由 在flutter中,路由就是页面之间的跳转。在 Flutter 中通过 Navigator 组件管理路由导航。并提供了管理堆栈的方法。如:Navigator.push 和 Navigator.pop Flutter 中给我们提供了两种配置路由跳转的方式: 基本路由 命名路由 基本路由的使用 主要方法 Navigator.of(context).push( MaterialPageRoute( builder:

m0_46527751的博客 1503

【Flutter——路由导航】

Flutter路由导航

muzillll的博客 3000

Flutter 命名路由、路由组、路由替换、路由销毁

一、路由表 和 命名路由 1、路由表 2、onGenerateRoute 路由拦截 3、命名路由导航 Navigator.of(context).pushName 4、效果: 二、路由替换 Navigator.of(context).pushReplacementNamed 三、根路由 pushNamedAndRemoveUntil 四、完整代码: 1、命名路由和路由组 2、路由替换和路由销毁 一、路由表 和 命名路由 之前写了一篇文章介绍了路由导航及路由传参,文章.

大灰狼的小绵羊哥哥的博客 2023

Flutter中的路由

1.概述 Flutter支持所有的路由场景,包括push页面、pop页面,以及页面间的参数传递等。flutter里面的路由可以分为如下两种。 静态路由:直接注册,不能传递参数。 动态路由:要自己构造实例,可以传递参数。 静态路由 动态路由 ...

wangzunkuan的博客 2270

flutter中的路由表和路由管理

查看更多flutter资料 MaterialPageRoute MaterialPageRoute继承自PageRoute类,PageRoute类是一个抽象类,表示占有整个屏幕空间的一个模态路由页面,它还定义了路由构建及切换时过渡动画的相关接口及属性。MaterialPageRoute是Material组件库的一个Widget,它可以针对不同平台,实现与平台页面切换动画风格一致的路由切换动画...

Seanyxie Blog 3018

Flutter:路由

Flutter 中的路由通俗的讲就是。在 Flutter 中通过 Navigator 组件管理路由导航。并提供了管理堆栈的方法。和。

weixin_46136019的博客 1568

Flutter入门进阶之旅(十三)Flutter 路由

距离上一篇专栏已经过去好长时间了,小伙伴们都等急了吧,刚刚过了个年,笔者刚刚从吃喝睡的状态复苏回来,开始马不停蹄的进入到工作状态,题外话说的有点多,接下来我们开始进入我们本篇博文的主题Fluttter 路由。 在本篇博文更新之前就有好多读者给我留言说专栏里讲到的东西都只能在一个页面上操作,涉及到多页面的时候不知道该怎么跳页或者不知道怎么给下一个页传值,那这期分享确实来的有点晚,通过本次的分享,读...

谢栋的专栏 2582

Flutter之路由配置

跳转与返回 Navigator.push 方法是向路由堆中添加一个新的路由 MaterialPageRoute的build方法返回一个新的组件并跳转 Navigator.push(context, MaterialPageRoute( builder: (context) => Show() )); Navigator.pop 方法是从路由堆里面拿出最前面的路由 Navigator.pop(context); 路由使用context参数传入 Navigator.of(co

moozixiao的博客 1538
上一篇: Flutter 事件监听以及EventBus
下一篇: Flutter Animation 动画
Leonardo_Fibonacci
博客等级 码龄10年 110粉丝 247原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值