8 Flutter UI 之 路由

news2024/9/28 23:22:48

一 基本路由

路由就是页面的跳转,通过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);
                })

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/353848.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

教你快速学会画动漫人物表情

动漫人物表情画法&#xff0c;3分钟教你快速学会画表情&#xff0c;快来跟我一起零成本学板绘吧&#xff01;咱们的免费板绘系列教程又来啦&#xff0c;今天教大家的板绘技能是什么呢&#xff1f;今天的板绘学习教程来教你如何画动漫女生的表情&#xff01; 板绘动漫女生的表情…

Instruction Tuning:无/少样本学习新范式

作者 | 太子长琴 整理 | NewBeeNLP大家好&#xff0c;这里是NewBeeNLP。今天分享一种简单的方法来提升语言模型的 Zero-Shot 能力——指示&#xff08;或指令&#xff09;微调&#xff08;instruction tuning&#xff09; &#xff0c;在一组通过指示描述的数据集上对语言模型微…

Nodejs和JavaScript的区别

ECMAScript 定义了语法&#xff0c;写javascript和nodejs都必须要遵守变量定义&#xff0c;循环、判断、函数原型和原型链、作用域和闭包、异步 可以看阮一峰老师写的ECMAScript 6 入门 即&#xff1a; 不能操作DOM,不能监听click事件&#xff0c;不能发送ajax请求不能处理…

Java LockSupport学习

面试题: 1、LockSupport为什么可以先唤醒线程后阻塞线程? 因为unpark()获得了一个凭证&#xff0c;之后再调用park()方法&#xff0c;就可以名正言顺的消费凭证&#xff0c;故不会阻塞。 2、LockSupport为什么唤醒两次后阻塞两次&#xff0c;但最终结果还会阻塞线程? 因为凭证…

Android 实现沉浸式全屏

前言 本文总结 Android 实现沉浸式全屏的实现方式。 实现沉浸式全屏 在一些需要全屏显示的场景下,比如玩游戏、看横屏视频的时候,内容全屏,占满窗口的体验会让用户更加沉浸到对内容的消费中,带来好的用户体验。 沉浸式显示具体来说就是如状态栏和导航栏部分的显示效果调…

C#:Krypton控件使用方法详解(第五讲) ——kryptonPanel

今天介绍的Krypton控件中的kryptonPanel&#xff0c;下面开始介绍这个控件的属性&#xff1a;首先要介绍的是这个控件的外观属性&#xff1a;Cursor属性&#xff1a;表示鼠标移动过这个控件的时候&#xff0c;鼠标的显示状态。具体属性值有哪些&#xff0c;如下图所示&#xff…

第一批因ChatGPT坐牢的人,已经上路了

大家好&#xff0c;我是 Jack。 ChatGPT 的火爆有目共睹&#xff0c;有人靠着它赚了第一桶金&#xff0c;也有人靠着它即将吃上第一顿牢饭。 任何一件东西的火爆&#xff0c;总会给一些聪明人带来机会。 艾尔登法环火的时候&#xff0c;一堆淘宝卖魂的&#xff1b;羊了个羊火…

动漫人物眼睛画法

本期的动漫绘画课程教大家来学习动漫人物眼睛画法&#xff0c;结合板绘软件从草稿开始一步步教你画出动漫人物眼睛&#xff0c;不用报动漫培训班也能学会&#xff0c;快来跟着本期的动漫人物眼睛画法教程试试吧&#xff01; 动漫人物眼睛画法步骤教程&#xff1a; 注意&#x…

Linux内核实现完全公平调度算法

Linux 进程调度算法经历了以下几个版本的发展&#xff1a; 基于时间片轮询调度算法。(2.6之前的版本)O(1) 调度算法。(2.6.23之前的版本)完全公平调度算法。(2.6.23以及之后的版本) 完全公平调度算法基本原理 完全公平调度算法 体现在对待每个进程都是公平的&#xff0c;那么…

ChatGPT AI 人工智能 开发路径

ChatGPT&#xff08;全名&#xff1a;Chat Generative Pre-trained Transformer&#xff09;&#xff0c;美国OpenAI研发的聊天机器人程序&#xff0c;于2022年11月30日发布。 推荐以下几个AI 开发学习资源 一、GPTZero AI: GPTZero GPTZero 是普林斯顿大学学生 Edward Tian …

Java爬虫—WebMagic

一&#xff0c;WebMagic介绍WebMagic企业开发&#xff0c;比HttpClient和JSoup更方便一&#xff09;&#xff0c;WebMagic架构介绍WebMagic有DownLoad&#xff0c;PageProcessor&#xff0c;Schedule&#xff0c;Pipeline四大组件&#xff0c;并有Spider将他们组织起来&#xf…

MySQL中JSON数据类型详解

目录 概要及优点 JSON定义 JSON字段的增删改查操作 插入操作 查询操作 修改操作 删除操作 如何对JSON字段创建索引&#xff1f; 加索引查询结果分析&#xff1a; 不加索引查询结果分析&#xff1a; 使用JSON时的注意事项 概要及优点 JSON数据类型是MySQL5.7.8开始支持的…

FlowChartX/Diagramming for ActiveX 4.9.8 Crack

构建完美的图表 如果您的应用程序以 ActiveX 平台为目标&#xff0c;并且您需要实现图表功能&#xff0c;那么您所需要的只是 FlowChartX。它提供了创建、自定义和呈现流程图的所有功能。 ActiveX 图表库&#xff1a;分类图表 图 Diagramming for ActiveX该组件为您提供了一组…

浅谈C++函数重载

C相较于C语言来说,重载是一重大特性,让我们一起简单的回顾一下重载那些事 传送门函数重载是什么为什么有函数重载函数重载是如何实现的总结函数重载是什么 函数重载:是函数的一种特殊情况,C允许在同一作用域中声明几个功能相似的同名函数 这些同名函数的形参列表(参数个数or类…

day19_抽象类丶接口

由来 当我们声明一个几何图形类&#xff1a;圆、矩形、三角形类等&#xff0c;发现这些类都有共同特征&#xff1a;求面积、求周长、获取图形详细信息。那么这些共同特征应该抽取到一个公共父类中。但是这些方法在父类中又无法给出具体的实现&#xff0c;而是应该交给子类各自…

当遇到国外客户的问题,你解决不了的时候怎么办

对我来说&#xff0c;今年的这个春节假期有点长&#xff0c;差不多休了一个月。复工之后&#xff0c;截止目前做到了60万RMB的业绩&#xff0c;但是相较于往年&#xff0c;整体状态还是差了些。往年的春节&#xff0c;我都是随时待命的状态&#xff0c;整个春节天天坐于电脑前&…

JSP 和 JSTL

文章目录&#x1f353;摘要&#x1f353;一、JSP&#x1f349;1.1 JSP的基础语法&#x1f36b;1.1.1 简介&#x1f36b;1.1.2 依赖&#x1f36b;1.1.3 注释&#x1f36b;1.1.4 Scriptlet 脚本&#x1f349;1.2 JSP的指令标签&#x1f36b;1.2.1 include 静态包含&#x1f36b;1…

2023年数学建模美赛A题(A drought stricken plant communities)分析与编程

2023年数学建模美赛A题&#xff08;A drought stricken plant communities&#xff09;分析与编程 2023年数学建模美赛D题&#xff08;Prioritizing the UN Sustainability Goals&#xff09;分析与编程 特别提示&#xff1a; 1 本文介绍2023年美赛题目&#xff0c;进行深入分析…

台式计算机加固态硬盘,台式机添加固态硬盘教程_台式主机固态硬盘怎么安装-win7之家...

固态硬盘是用固态电子存储芯片阵列制成的硬盘&#xff0c;也是电脑中比较常见的内存硬件&#xff0c;有些用户在使用电脑时候&#xff0c;由于内存不足导致系统运行较卡的情况&#xff0c;往往会选择添加固态硬盘来解决&#xff0c;那么台式主机固态硬盘怎么安装呢&#xff1f;…

Ansible中的角色使用(ansible roles)

文章目录一、ansible 角色简介二、roles目录结构三、role存放的路径&#xff1a;配置文件ansible.cfg中定义四、创建目录结构五、playbook中使用rolesplaybook变量会覆盖roles中的定义变量六、控制任务执行顺序七、ansible—galaxy命令工具八、安装选择的角色1.从网上下载&…