在 Flutter 中Navigator.push 用于实现页面之间的导航

如何使用Navigator实现导航功能 到目前为止,我们介绍的内容都在一个页面中,本章回中将介绍中在Flutter中如何进行页面切换,这里说的页面切换和Android中的Activity之间切换或者IOS中的UIViewController之间的切换完全相同。Flutter提供了Router和Navigator这两个类来实现页面之间的跳转。我觉得Flutter的页面跳转和IOS类似:提供了专门的页面跳转管理类,这个管理类在IOS中是UINavigationController,在Flutter中是Navigator. 阅读详情

在 Flutter 中,Navigator.push 是一个非常重要的方法,用于实现页面之间的导航。通过 Navigator.push,你可以将一个新的页面(路由)推送到导航栈中,从而显示新的内容。

以下是一个详细的教程,帮助你理解如何使用 Navigator.push 进行页面跳转。


一、基本用法

Navigator.push 的基本语法如下:

Navigator.push(
  context,
  MaterialPageRoute(builder: (context) => TargetPage()),
);
参数说明:
  1. context:当前的 BuildContext,通常是从 StatelessWidget 或 StatefulWidget 的 build 方法中获取。
  2. MaterialPageRoute:定义了一个页面路由,builder 属性用于指定目标页面的内容。

二、完整示例

以下是一个完整的示例,演示如何从主页跳转到另一个页面。

示例代码:
import 'package:flutter/material.dart';

void main() {
  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  
  Widget build(BuildContext context) {
    return MaterialApp(
      home: HomePage(),
    );
  }
}

// 主页
class HomePage extends StatelessWidget {
  
  Widget 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 {
  
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(title: Text('第二页')),
      body: Center(
        child: ElevatedButton(
          onPressed: () {
            // 返回上一页
            Navigator.pop(context);
          },
          child: Text('返回主页'),
        ),
      ),
    );
  }
}
运行效果:
  1. 启动应用后,显示的是 HomePage。
  2. 点击按钮后,跳转到 SecondPage。
  3. 在 SecondPage 中点击按钮,返回到 HomePage。

三、带参数的页面跳转

有时你需要在页面之间传递数据。可以通过构造函数将参数传递给目标页面。

示例代码:
// 主页
class HomePage extends StatelessWidget {
  
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(title: Text('主页')),
      body: Center(
        child: ElevatedButton(
          onPressed: () {
            // 跳转到新页面,并传递参数
            Navigator.push(
              context,
              MaterialPageRoute(
                builder: (context) => SecondPage(message: '来自主页的消息'),
              ),
            );
          },
          child: Text('跳转到第二页'),
        ),
      ),
    );
  }
}

// 第二页
class SecondPage extends StatelessWidget {
  final String message;

  SecondPage({required this.message});

  
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(title: Text('第二页')),
      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: [
            Text('收到的消息:$message'),
            ElevatedButton(
              onPressed: () {
                // 返回上一页
                Navigator.pop(context);
              },
              child: Text('返回主页'),
            ),
          ],
        ),
      ),
    );
  }
}
说明:
  1. 在 SecondPage 的构造函数中定义了一个 message 参数。
  2. 使用 Navigator.push 跳转时,通过构造函数传递参数。
  3. 在目标页面中,直接使用传递的参数即可。

四、返回值的页面跳转

有时你可能需要从目标页面返回一些数据。可以使用 Navigator.push 的返回值来实现。

示例代码:
// 主页
class HomePage extends StatelessWidget {
  
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(title: Text('主页')),
      body: Center(
        child: ElevatedButton(
          onPressed: () async {
            // 跳转到新页面并等待返回值
            final result = await Navigator.push(
              context,
              MaterialPageRoute(
                builder: (context) => SecondPage(),
              ),
            );

            // 显示返回值
            ScaffoldMessenger.of(context).showSnackBar(
              SnackBar(content: Text('返回值:$result')),
            );
          },
          child: Text('跳转到第二页'),
        ),
      ),
    );
  }
}

// 第二页
class SecondPage extends StatelessWidget {
  
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(title: Text('第二页')),
      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: [
            ElevatedButton(
              onPressed: () {
                // 返回数据
                Navigator.pop(context, '这是从第二页返回的数据');
              },
              child: Text('返回数据'),
            ),
          ],
        ),
      ),
    );
  }
}
说明:
  1. 使用 await Navigator.push 捕获目标页面返回的数据。
  2. 在目标页面中,通过 Navigator.pop(context, data) 返回数据。
  3. 在主页中,接收到返回值后,可以通过 SnackBar 或其他方式展示。

五、命名路由(Navigator.pushNamed)

除了动态创建路由外,Flutter 还支持命名路由。这种方式更适用于大型项目,因为可以集中管理路由。

示例代码:
import 'package:flutter/material.dart';

void main() {
  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  
  Widget build(BuildContext context) {
    return MaterialApp(
      initialRoute: '/',
      routes: {
        '/': (context) => HomePage(),
        '/second': (context) => SecondPage(),
      },
    );
  }
}

// 主页
class HomePage extends StatelessWidget {
  
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(title: Text('主页')),
      body: Center(
        child: ElevatedButton(
          onPressed: () {
            // 使用命名路由跳转
            Navigator.pushNamed(context, '/second');
          },
          child: Text('跳转到第二页'),
        ),
      ),
    );
  }
}

// 第二页
class SecondPage extends StatelessWidget {
  
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(title: Text('第二页')),
      body: Center(
        child: ElevatedButton(
          onPressed: () {
            // 返回上一页
            Navigator.pop(context);
          },
          child: Text('返回主页'),
        ),
      ),
    );
  }
}
说明:
  1. 在 MaterialApp 中定义了 routes,其中键是路由名称,值是对应的页面构建器。
  2. 使用 Navigator.pushNamed 跳转到指定的命名路由。

六、总结

  • Navigator.push:用于动态创建路由并跳转到新页面。
  • Navigator.pushNamed:通过命名路由跳转,适合管理复杂的应用。
  • 传递参数:通过构造函数或 ModalRoute.of(context) 获取参数。
  • 返回值:使用 Navigator.pop 返回数据,并通过 await 捕获返回值。
Flutter 初识:导航控件 CupertinoPageRoute 是一个iOS风格的页面路由,用于在iOS平台上提供一致的导航体验。它同样继承自PageRoute,并实现了TransitionRoute用于处理页面切换时的过渡动画。MaterialPageRoute 是一个材料设计风格的页面路由,用于在安卓平台上提供一致的导航体验。Navigator 用于管理应用程序的路由,通过堆栈结构来实现页面的进出。它支持页面的推入(push)和弹出(pop)操作,允许在应用中进行复杂的导航模式。尝试从导航堆栈中弹出当前页面。 阅读详情

相关推荐

总结flutter Navigator页面跳转方法的应用场景

Flutter 的 Navigator 是用于管理页面导航的核心类,它提供了多种方法来处理路由和页面之间的切换。

m0_37618883的博客 1098

在Flutter中使用Navigator.push()方法切换页面

【代码】在Flutter中使用Navigator.push()方法切换页面。

XinBaDeRongYao的博客 1051

Flutter 页面导航Navigator.push 与自适应导航模式(14)

Flutter导航系统采用栈结构实现页面管理,支持两种适配不同屏幕的导航模式:小屏幕使用栈式页面跳转(Navigator.push/pop),大屏幕采用侧边栏+详情面板布局。小屏幕通过CupertinoPageRoute实现iOS风格的页面切换动画和返回手势,而大屏幕通过状态管理直接更新右侧内容。两种模式通过LayoutBuilder自动切换,分别复用相同的视图组件但调整交互逻辑,实现了响应式导航体验。

hello.reader 201

新手理解Navigator的教程

为什么80%的码农都做不了架构师?>>> ...

weixin_33872660的博客 406

ICC II 时钟树综合(CTS)前奏:从约束定义到NDR规则的全方位设置指南

本文详细介绍了ICC II中时钟树综合(CTS)的前期准备工作,包括约束定义、NDR规则设置和时钟平衡点控制等关键步骤。通过实际案例和代码示例,指导工程师如何优化时钟偏斜、插入延迟和信号质量,确保芯片设计的时序收敛和性能稳定。特别强调了非默认布线规则(NDR)在时钟网络设计中的重要性。

weixin_42530458的博客 212

CarPlay wired(USB)连接方案

CarPlay的wired(USB)的连接方案要求车载设备至少要支持USB2.0 Hi-Speed,支持USB Host Mode,该模式要求车载设备能够工作在USB device模式下,因为Apple设备在CarPlay中是作为USB Host的。而通常情况下,车载设备USB是工作在USB Host模式的,而外接的USB设备是工作在USB Device模式的,因而在这种情况下的CarPlay wired(USB)连接方案中就需要进行USB的模式切换。模式切换完成后便是Apple设备(USB HOST)的枚

Ke8323的博客 1万+

flutter学习--路由Navigator跳转

在flutter开发中,我们如何从A界面跳转到B界面?如何将A界面的参数传递给B界面?如何将B界面的数据回传给A界面?这是本章重点讲解的内容。

qinbin2015的博客 639

Zemax实战:20×超高清变焦镜头设计全流程解析(从架构到制造)

本文详细解析了使用Zemax软件设计一款20倍变焦比、恒定F2.8光圈8K超高清镜头的全流程。从应对恒定光圈、宽光谱与8K解析力三大挑战的初始架构规划,到构建多重组态模型、分七阶段进行像差优化与公差分析,最终跨越制造鸿沟,为广播级影视与高精度工业检测应用提供了实战指南。

sun99的博客 552

flutter图片点击跳转_Flutter 08: 图解页面小跳转 (一)

小菜最近在抽时间学习 Flutter,从零开始,一步一步走的都很艰难,前几天搭了一个基本的【登录】页面,现在学习下一步,页面之间的跳转;今天小菜整理一下 Flutter 测试过程中常用的页面跳转方式。最权威的资料永远是 Flutter 官网,很精华,只可惜小菜英语水平太次,读起来有点吃力。但小菜了解到,Flutter 中跳转一定要用到 Navigator,就像是 Android 中的 Intent...

weixin_35794316的博客 270

无限泛化!AI背景文字识别,腾讯文字六宫格

本文介绍了生成大规模文字验证码数据集的方法,通过使用上百种字体和2万+字库,结合随机背景和数十种图像增强技术,生成了2000万+的多样化样本。该方法采用二阶段训练策略,确保模型对字体、形态、形变等具有强泛化能力,可适配腾讯、咸鱼等多种平台的文字验证码识别,包括生僻字和复杂形变情况。生成的模型在多种验证码场景下表现优异,但强调该方法仅用于技术研究,严禁非法用途。

码王吴彦祖的博客 563

【置顶】TEE从入门到精通-[目录]

此专栏讲解包含不限于optee、商用TEE、常规的安全业务设计。但主要基于optee最新代码,深度讲解和剖析各项原理和机制...

baron-周贺贺-代码改变世界ctw 6427

Flutter Navigator Push流程分析

我们可以看出NavigatorState中返回了Overlay,也就说明了为什么Route不是返回Widget,而是OverlayEntry,因为NavigatorState就是通过Overlay来把页面上屏的,我们再关注initialEntries这个属性,我们传入了_allRouteOverlayEntries,我们再来看看_allRouteOverlayEntries是什么!我们可以看出idle是路由状态的分水岭,idel之前的状态,都是路由正在入栈的状态,idel后面的状态,基本是弹栈有关的状态。

qq_21349039的博客 1321

学Simulink--基于高比例可再生能源渗透的复杂电网建模场景实例:新能源高渗透下传统同步机主导系统的动态响应建模

摘要:本文详细介绍使用MATLAB/Simulink构建高比例可再生能源渗透的电网系统模型。主要内容包括:系统结构设计(新能源发电、同步发电机、电网等模块)、详细建模步骤(从创建项目到集成各模块)、关键控制算法实现(如MPPT和调速器控制)以及仿真分析。通过该模型可研究新能源高渗透率下传统同步机系统的动态响应特性,为电力系统稳定性分析提供有效工具。文章包含示例代码和典型仿真结果,展示了频率、电压等关键参数的稳定性表现。

xiaoheshang_123的博客 86

深入探究Flutter中的页面导航器:Navigator详解

自定义转场动画是提升应用用户体验的重要手段之一。在本文中,我们深入探讨了Flutter中Navigator的主要功能和用法,包括页面路由、路由参数传递、命名路由、路由观察器、自定义转场动画、透明路由、Hero动画、路由保持状态、导航器嵌套等方面。导航器嵌套允许我们在一个页面内部创建多个导航器,并分别管理它们之间的导航栈,从而实现更灵活和复杂的页面管理。在Flutter中,Navigator扮演着非常重要的角色,它允许我们在应用程序中进行页面的跳转、返回以及传递参数等操作,为用户提供了流畅、高效的导航体验。

繁依Fanyi的博客 3128

【读代码】从claude skills到superpowers项目

最近claude skills成了大热门,今天一起看下GitHub 上的开源技能框架,他将“工作流”封装为“技能” (Skills)。本文尝试剖析该项目的技能粒度定义、多技能关联架构、应用逻辑等。与传统的 Function Calling 不同,Superpowers 中的 Skill 定义粒度并非“原子操作”,而是**“认知模式” (Cognitive Mode) 或“工作阶段”**。

kakaZhui的博客 1921

UNET改进77:全网首发-添加CFBlock |

本文介绍了在UNet模型中集成CFBlock注意力机制的实现方法。主要分为三个步骤:1) 创建CFBlock模块,包含卷积注意力机制和MLP;2) 在UNet连接处添加注意力模块;3) 在卷积层中嵌入注意力机制。具体实现包括:定义Conv、MLP和ConvolutionalAttention等基础模块,构建CFBlock核心结构;在UNet跳跃连接处插入注意力模块;将注意力机制整合到DoubleConv和Down模块中。该方法通过在不同位置引入注意力机制,可有效提升模型的特征提取能力。代码实现使用PyTor

AIcurator的博客 388

Flutter 中的页面跳转及页面之间传参(路由跳转)

Flutter 中的页面跳转及页面之间传参(路由跳转) 大多数应用程序具有多个页面或视图,并且希望将用户从页面平滑过渡到另一个页面。Flutter 的路由和导航功能可帮助你管理应用中屏幕之间的命名和过渡。 管理多个页面时有两个核心概念和类:Route 和 Navigator。 一个 Route 是一个屏幕或页面的抽象,Navigator 是管理 Route 的 Widget。Navigator 可以通过使 Route 入栈和出栈来实现页面之间的跳转。 在 Android 开发中,Activity 相当于“

卜大爷的博客 2万+

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

Flutter路由之Navigator详解

含义: Navigator 继承自 StatefulWidget,它也是小组件,它有很多相关静态函数,可以帮我们达到页面跳转和数据交互的功能: push 将设置的router信息推送到Navigator上,实现页面跳转。 of 主要是获取 Navigator最近实例的好状态。 pop 导航到新页面,或者返回到上个页面。 canPop 判断是否可以导航到新页面 maybePop 可能会导航到新页面 ...

watertekhqx的博客 6464

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

flutter系列之:在flutter中使用导航Navigator

一个APP如果没有页面跳转那么是没有灵魂的,页面跳转的一个常用说法就是Navigator,flutter作为一个最为优秀的前端框架,Navigator肯定是必不可少的,那么在flutter中如何使用Navigator呢?一起来看看吧。Navigator是每个flutter app都少不了的组件,希望大家能够掌握。

程序那些事 1491

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

在flutter中使用导航Navigator

Navigator是每个flutter app都少不了的组件,希望大家能够掌握。本文的例子:https://github.com/ddean2009/learn-flutter.git。

KQe397773106的博客 876

Flutter 导航与路由管理:Navigator 的深入解析与实践

在移动应用开发中,页面导航是用户体验的核心组成部分。Flutter 提供了强大而灵活的导航系统,主要通过 Navigator 组件来实现。本文将全面介绍 Flutter 中 Navigator 的使用方法,涵盖基础导航操作、进阶技巧以及最佳实践。

vvilkin的学习备忘 1459

Flutter之Navigator解读

简述 本文适合对Flutter已经有简单了解的初学者 官网之Navigator 官网洋洋洒洒的写了好长一页, 对于初学者十分的不友好,小编的英文水平可能还停留在nice to meet your 的地步.这个栏目我打算省略...但是我胜在有谷歌翻译(真没在打广告) 我还是简单粗略的解读(翻译)一下,在说Navigator之前是我们先简单说一下Flutter中的Router的概念 Router 路...

weixin_33979203的博客 1714

【Flutter】Flutter 页面跳转 ( 路由 Route | 导航器 Navigator | 页面关闭 )

一、Flutter 页面跳转、 二、路由信息注册、 三、通过路由名实现页面跳转、 四、通过路由名实现页面跳转、 五、退出界面、 六、完整代码示例、 七、相关资源

让 学习 成为一种 习惯 ( 韩曙亮 の 技术博客 ) 2736

Flutter实现页面跳转切换(路由)

在移动开发中页面跳转也被称为导航管理,也就是路由,在Flutter中是如何实现的呢 import 'package:flutter/material.dart'; ///页面跳转 void main() => runApp(new FirstPage()); class FirstPage extends StatefulWidget { @override _FirstPage...

believeinbelieve的博客 2万+

flutter中页面跳转之Navigator

在安卓和苹果设备上都有页面跳转的操作,flutter中是使用Navigator来管理页面之间的跳转的。在万物皆Widget的flutter中,Navigator自然也没有逃过成为一个widget的命运,它属于StatefulWidget的子类。Navigator负责管理页面的的堆栈,并提供管理堆栈的方法,像push(显示页面)、pop(关闭页面); Nav...

guo807015563的专栏 1423

flutter学习--页面跳转

一般页面导航和返回 RaisedButton按钮组件 它有两个最基本的属性: child:可以放入容器,图标,文字。让你构建多彩的按钮。 onPressed:点击事件的相应,一般会调用Navigator组件。 Navigator.push 和 Navigator.pop Navigator.push:是跳转到下一个页面,它要接受两个参数一个是上下文context,另一个是要跳转的函数。 ...

pgg_cold的博客 8831
上一篇: flutter点击事件教程
下一篇: 在蓝牙信号扫描中,dBm 的负值是正常现象,表示信号强度
getapi
博客等级 码龄2年 618粉丝 132原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值