8 Flutter UI 之 路由

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( 阅读详情

一 基本路由

路由就是页面的跳转,通过Navigator组件管理路由导航

Flutter 提供了两种方式 基本路由和命名路由

 Container(
      child: Center(
          child: Column(
        children: [
          ElevatedButton(
              onPressed: () {
                // 跳转到购物车界面
                Navigator.of(context)
                    .push(MaterialPageRoute(builder: (BuildContext context) {
                  return SearchPage();
                }));
              },
              child: Text("Jump to Search Page")),
          ElevatedButton(
              onPressed: () {
                // 跳转到购物车界面并且传值
                Navigator.of(context)
                    .push(MaterialPageRoute(builder: (BuildContext context) {
                  return FormPage(title: "title from home");
                }));
              },
              child: Text("Jump to Search Page with Parameters"))
        ],
      )),
    )

import 'package:flutter/material.dart';

class SearchPage extends StatelessWidget {
  const SearchPage({super.key});

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(title: Text("搜索页面")),
      body: Center(
        child: Text("SearchPage"),
      ),
    );
  }
}

import 'package:flutter/material.dart';

class FormPage extends StatelessWidget {
  // 接收传递过来的值
  String title;
  FormPage({this.title = "Form"});
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text("This is form page"),
      ),
      body: Text(title),
      // 返回的操作
      floatingActionButton: FloatingActionButton(
        onPressed: () {
          Navigator.of(context).pop();
        },
        child: Text("Back"),
      ),
    );
  }
}

二 命名路由基本使用

在大项目中统一管理路由,

在main 文件中统一去配置路由

MaterialApp(
      title: 'Flutter Demo',
      theme: ThemeData(
        primarySwatch: Colors.red,
      ),
      home: Tabs(title: "这是一首简单的小情歌"),
      // map类型
      routes: {
        '/form': (context) => FormPage(),
        '/search': (context) => SearchPage()
      },
    );

ElevatedButton(
              onPressed: () {
                Navigator.pushNamed(context, "/search");
              },
              child: Text("Jump to Search Page")),
          ElevatedButton(
              onPressed: () {
                Navigator.pushNamed(context, "/form");
              },
              child: Text("Jump to Search Page with Parameters"))

三 路由传递参数的基本使用

1  首先在main 中配置好路由

其中  onGenerateRoute 为固定的写法

class MyApp extends StatelessWidget {
  // This widget is the root of your application.
  final routes = {
    "/form": (context) => FormPage(),
    "/search": (context, {arguments}) => SearchPage(arguments: arguments)
  };

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter Demo',
      theme: ThemeData(
        primarySwatch: Colors.red,
      ),
      home: Tabs(title: "title"),
      // map类型
      // initialRoute: '/',
      // 路由传值
      onGenerateRoute: (RouteSettings settings) {
        //String? 表示name为可空类型
        final String? name = settings.name;
        //Function? 表示pageContentBuilder为可空类型
        final Function? pageContentBuilder = routes[name];
        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;
          }
        }
      },
    );
  }
}

2 在对应的页面写好接收的参数

import 'package:flutter/material.dart';

class SearchPage extends StatefulWidget {
  final arguments;
  SearchPage({this.arguments});
  @override
  State<SearchPage> createState() => _SearchPageState(arguments: arguments);
}

class _SearchPageState extends State<SearchPage> {
  final arguments;
  _SearchPageState({this.arguments});
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(title: Text("搜索页面")),
      body: Center(
        child: Text(
            "SearchPage + ${this.arguments != null ? this.arguments["id"] : "emptyBoy"}"),
      ),
    );
  }
}

3  跳转操作

ElevatedButton(
              onPressed: () {
                Navigator.pushNamed(context, "/search", arguments: {"id": 123});
              },
              child: Text("Jump to Search Page")),

四 路由文件的抽取配置

1 单独新建一个Routes.dart ,专门配置路由 

import 'package:flutter/material.dart';
import '../pages/tabs/Form.dart';
import '../pages/tabs/Search.dart';
import '../pages/tabs/Tabs.dart';

//配置路由,定义Map类型的routes,Key为String类型,Value为Function类型
final Map<String, Function> routes = {
  '/': (context) => Tabs(),
  '/form': (context) => FormPage(),
  '/search': (context, {arguments}) => SearchPage(arguments: arguments),
};

//固定写法
var onGenerateRoute = (RouteSettings settings) {
  //String? 表示name为可空类型
  final String? name = settings.name;
  //Function? 表示pageContentBuilder为可空类型
  final Function? pageContentBuilder = routes[name];
  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;
    }
  }
};

2 在main 中进行引入并且调用 

import 'routes/Routes.dart';


MaterialApp(
      title: 'Flutter Demo',
      theme: ThemeData(
        primarySwatch: Colors.red,
      ),
      home: Tabs(),
      // map类型
      initialRoute: '/',
      // 路由传值
      onGenerateRoute: onGenerateRoute,
    );

五  替换路由

这样的示例,从首页跳转到登录页面,从登录页面跳转到注册页面1,从注册页面跳转到注册页面2,完成之后返回首页。这时候要用到替换路由的方式push

ElevatedButton(
        onPressed: () {
          Navigator.of(context).pushReplacementNamed("/registerFirst");
        },
        child: Text("下一步"),
      )

六 返回到跟路由

使用上面的替换路由可以实现返回到根路由,如果不适用的话,用以下的方式进行实现返回到跟路由。

代码的意思是移除所有的路由 创建一个新的路由

ElevatedButton(
                child: Text("返回首页"),
                onPressed: () {
                  Navigator.of(context).pushAndRemoveUntil(
                      new MaterialPageRoute(builder: (context) => Tabs()),
                      (route) => false);
                })

Flutter 从入门到精通 - 完整课程总结 经过12堂精心设计的课程,您已经从Flutter初学者成长为Flutter开发专家!以下是您掌握的全部技能和知识。 阅读详情

相关推荐

Flutter - 路由管理 - 02 - Fluro

Fluro路由地址,只能传递String类型(并且不支持中文),所以需要对 中文,intdoublebool,自定义类型进行一个转换 , 写了一个 转换类/// fluro 参数编码解码工具类/// fluro 传递中文参数前,先转换,fluro 不支持中文传递/// fluro 传递后取出参数,解析///字符串解码/// string 转为 int/// string 转为 double/// string 转为 bool。

2401_84123294的博客 1119

浅识Flutter 基本组件MaterialAPP的initialRoute和onGenerateRoute属性 app首页

Flutter基本组件MaterialAPP的initialRoute和onGenerateRoute属性 app首页

qq_43336158的博客 2468

IEC61850客户端连接实战:CMS vs MMS协议抓包对比与性能初探(基于YX-PIS协议栈)

本文深入探讨了IEC61850客户端连接中CMS与MMS协议的抓包对比与性能优化。通过Wireshark抓包分析、协议栈配置实战和性能基准测试,揭示了两种协议在连接建立、数据交互和性能调优方面的关键差异,为智能电网自动化系统的协议选择提供了实用指南。

weixin_29209805的博客 215

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

S32K3基于EB配置GPT触发WDG的实战解析

本文详细解析了S32K3 MCU基于EB tresos工具配置GPT定时器触发看门狗(WDG)的实战方法。通过分析协同工作机制、MCAL配置步骤及代码实现,帮助开发者构建可靠的硬件监控系统,提升汽车电子系统的安全性与实时性。

f9g0h的博客 202

无网络环境部署:手动获取并安装OneNote for Windows 10完整指南

本文提供了一份详尽的OneNote for Windows 10离线安装指南。针对无网络或内网隔离环境,详细介绍了如何从官方渠道获取正确的产品ID,利用第三方工具下载纯净的.appxbundle安装包,并解决系统兼容性与依赖框架问题。最后,通过PowerShell管理员命令完成安全部署,是IT管理员和高级用户在离线环境下部署UWP应用的实用参考。

loss4bartender的博客 495

Flutter 路由

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

github_36850997的博客 1233

GD32F303开发实战(一):从零搭建MDK工程与时钟配置详解

本文详细介绍了如何从零开始为GD32F303微控制器搭建一个清晰、可维护的MDK工程模板。内容涵盖开发环境准备、工程目录结构规划、文件分组管理、关键工程配置,并重点解析了时钟树原理,手把手指导配置108MHz系统时钟。通过实战步骤与常见问题排查,帮助开发者构建一个稳定可靠的开发基础,便于后续功能扩展。

weixin_29174141的博客 269

Flutter路由总结2

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

isAlberYu的博客 839

读《认知科学导论》(萨伽德) 总结

1. 作者的写作思路 本书是建立在对心智的理解采用表征与计算的方式。对心智表征-计算的理解方式是与计算机的本质相联系。计算机本质上是一个符号系统,符号系统包含两个部分,一个是符号,另一个是建立在符号上的操作。对心智采用表征-计算的方式理解,很容易与计算机建立起类比关系。同时人们在探索人工智能领域采用表征-计算方式已经取得了无数辉煌的成就,故表征-计算式现在研究的主流方法。 本书的有两个部分组成

xiaoqiangXX的专栏 3450

前端埋点的实践

1、前言 开始正文前先介绍一下埋点的概念~,(熟悉的朋友可以略过) 前端埋点: 是一种手段,它的目的是上报相关行为数据,相关人员以数据为依据来分析产品在用户端的使用情况,根据分析出来的结果辅助产品优化、迭代。 BI:商业智能,公司内部做数据分析相关的部门。 2、背景 在流量红利逐渐消失的现在,数据的采集、分析和精细化的运营显得更加重要,所以埋点的需求在互联网产品中是很常见的,目的上面也提到了。我们的追求就是又快又好的做好埋点工作,但是现实却不那么美好;目前我们团队在前端埋点方面存在一些痛点: 在构造埋点字段

Arui_0的博客 1772

Flutter实战:打造个性化视频播放APP(附完整源码)

本文详细介绍了如何使用Flutter框架开发一个个性化视频播放APP。从环境搭建、项目结构设计,到核心的视频播放功能实现,涵盖了使用video_player插件、解析苹果CMS接口数据、构建自定义播放器UI以及状态管理等关键技术点。文章提供了完整的实战代码和架构思路,帮助开发者快速掌握Flutter视频应用开发,并附有完整源码供参考。

yolo5detector的博客 200

Oasys安装教程

在基环境下执行然后去 C:\Users.condarc打开 .condarc这个文件 删除干净里面的东西。

weixin_44254178的博客 1294

HarmonyOS 弦乐调音器开发实战 01:先分清 ArkTS 1.0.7 与 Flutter 1.0.8 两条工程线

从真实 StringtTuning 项目出发,梳理原生 ArkTS 1.0.7 与 Flutter 1.0.8 两条 HarmonyOS 工程线,明确版本、入口、截图、构建产物和验证边界。

nullregedit的博客 356

用生成式AI自动生成测试用例的完整教程

本文旨在帮助测试工程师、开发人员快速掌握“生成式AI自动生成测试用例”的核心技术,覆盖从概念理解、工具选择到实战落地的全流程。无论是Web应用、API接口还是移动端功能测试,你都能找到可复用的方法。本文将按照“概念→原理→实战→避坑”的逻辑展开:先通过生活案例理解生成式AI如何生成测试用例,再拆解核心算法原理,接着用Python代码演示完整生成流程,最后分享实际应用中的优化技巧和未来趋势。生成式AI:能“创造内容”的AI模型(如ChatGPT、CodeLlama),像会写作文的智能笔。测试用例。

AIGC应用创新大全的博客 1580

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

flutter基础入门教程(Dart语法+UI布局+页面路由+后端连接)

1基础安装步骤教程 Android Studio安装与配置 https://juejin.cn/post/6844904054569582605 安装Android Studio前,需要先选择安装Java环境,Java需要到Oracle官网上下载安装,需要注册一个Oracle账号。 https://www.oracle.com/java/technologies/javase/javase-jdk8-downloads.html Windows 10 配置Java 环境变量 https://www.runo

小哈里的博客 9377

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

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

Flutter开发笔记:Flutter路由技术

本文介绍 Flutter 路由的原理,以及 go_router 模块的用法

jclee95的个人博客 2011

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

Flutter Planets项目解析:如何快速创建Material Design风格的行星卡片UI

你是否想要学习如何用Flutter快速构建精美的Material Design风格UI?Flutter Planets项目是一个完美的学习案例!这个开源项目展示了如何使用Flutter创建美观的行星卡片界面,是初学者学习Flutter UI开发的绝佳教程。本文将深入解析Flutter Planets项目的核心实现,教你如何快速创建Material Design风格的行星卡片UI。 ## 🚀 项

gitblog_00718的博客 827

视频教程-Flutter知识点-路由导航-flutter

Flutter知识点-路由导航 捷智云视频会议系统联合创始人,国内首本Flu...

weixin_33220891的博客 105

Flutter项目

本节的学习目标是通过 Flutter 技术,实现 仿拉勾教育 App 的效果。

woyebuzhidao321的博客 4071

Flutter实现Service + UI 全面跨平台

Flutter作为跨平台的UI框架,其可行性已经被市场所认可。UI跨端后,我们自然会希望一些运行在终端的小服务也能跨端,特别是当这个小服务还涉及到一些 UI 的展示。我们希望Flutter能承担这个角色,让其跨端能力更进一步。在常规业务场景基本都不会使用dart开发后台服务;针对整机小型服务的需求,我认为Flutter还是挺香的,内存不存在隐患,还能前后端都跨平台。本篇文章,分享了整个shelf框架编写web服务的经验,我认为在这个小众的类目中这篇文章算是非常齐全了;同时我们也。

1 2833

深度解析 Flutter 路由管理:从原生路由到 AutoRoute 的优雅升级与性能优化

创建文件,集中配置所有路由:dart// 导入页面组件// 代码生成后自动生成的文件/// 根路由配置replaceInRouteName: 'Page,Route', // 自动替换路由名称中的Page/Route后缀routes: [// 首页路由(初始路由)initial: true, // 设置为初始路由),// 商品详情页路由(带参数)path: '/product-detail/:productId', // 路径参数(可选,支持深度链接)),// 购物车页路由。

2501_94507526的博客 1115

flutter开发之状态管理、路由管理、

响应式的编程框架中都会有一个永恒的主题——“状态(State)管理”,无论是在 React/Vue(两者都是支持响应式编程的 Web 开发框架)还是 Flutter 中,他们讨论的问题和解决的思想都是一致的。所以,如果你对React/Vue的状态管理有了解,可以跳过本节。言归正传,我们想一个问题,的状态应该被谁管理?Widget本身?父 Widget?都会?还是另一个对象?答案是取决于实际情况!以下是管理状态的最常见的方法:Widget 管理自己的状态。Widget 管理子 Widget 状态。

u013712343的博客 1206

Flutter基础 -- Flutter常用组件

文本组件 Text 导入资源 图片组件 image 图标组件icon 按钮组件 路由管理v1 Navigator 样式管理 手势事件 输入框 TextField

原来45的博客 5887

Android开发flutter路由管理

路由在移动开发中通常指页面,在Android中通常指代一个Activity。Flutter中的路由管理与原生开发较类似,路由管理指页面跳转关系。路由入栈(push)操作对应打开一个新页面,出栈(pop)操作对应关闭页面。routes: {将给定的路由入栈(即打开新的页面),返回值是一个Future对象,用以接收新路由出栈(即关闭)时的返回数据。将给定的路由名入栈,返回值是一个Future对象,用以接收新路由出栈(即关闭)时的返回数据。

Android 开发架构 445

Android与Flutter混合开发-UI交互

前言 本人是做android的,这边只介绍下Android和Flutter的混合开发。 关于原生和Flutter的混合开发,网上有很多相关的文章了,基本上都是使用FlutterView和FlutterFragment的方式去做的,但是在新版Flutter SDK 1.12版本上,Flutter团队把io.flutter.facade.Flutter这个包给删了,上面俩种方式直接凉了,根本无法在A...

小小涛的博客 1076
上一篇: 7 Flutter UI 之 自定义有状态组件 和自定义底部导航条
下一篇: 9 Flutter UI 之 自定义AppBar 和顶部菜单
Leonardo_Fibonacci
博客等级 码龄10年 110粉丝 247原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值