Flutter路由——Navigator2.0

news2024/11/16 3:22:22

Navigator 2.0提供了一系列全新的接口,可以实现将路由状态成为应用状态的一部分,新增的API如下:

  • Page:用来表示Navigator路由栈中各个页面的不可变对象,Page是一个抽象类通常使用它的派生类:MaterialPage或CupertinoPage;
  • Router:用来配置要用Navigator展示的页面列表,通常该页面列表会根据系统或应用程序的状态改变而改变,除了直接使用Router本身外还可以使用MaterialApp.router()来创建Router;
  • RouterDelegate:定义应用程序中的路由行为,例如Router如何知道应用程序状态的变化以及如何响应,监听RouteInformationParser和应用状态,并使用当前列表来构建Pages;
  • RouteInformationParser:可缺省,主要应用于web,持有RouteInformationProvider提供的RouteInformation,可以将其解析为我们定义的数据类型;
  • BackButtonDispatcher:响应后退按钮,并通知Router;

上面的API中BackButtonDispatcher很少用到,对于移动端来说,只需要用到Page、Router和RouterDelegate这三个API即可。

RouterDelegate与Router、RouteInformationParser在一起的交互和应用程序的状态如下:
在这里插入图片描述

  • 1.当系统打开一个新页面时,RouteInformationParser会将其转换为应用中的具体数据类型T;
  • 2.该数据类型会被传递给RouterDelegate的setNewRoutePath方法,我们可以在这里更新路由状态;
  • 3.notifyListeners会通知Router重建RouterDelegate;
  • 4.RouterDelegate.build()返回一个新的Navigator实例,并最终展示出打开的页面;

代码实例:

/// @description hu
import 'package:flutter/material.dart';
import 'package:up_china/model/video_model.dart';
import 'package:up_china/page/home_page.dart';
import 'package:up_china/page/video_detail_page.dart';

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

class UPApp extends StatefulWidget {
  
  State<StatefulWidget> createState() => _UPAppState();
}

class _UPAppState extends State<UPApp> {
  UPDelegate _routerDelegate = UPRouterDelegate();
  UPRouteInformationParser _routeInformationParser =
  UPRouteInformationParser();

  
  Widget build(BuildContext context) {
    print('_UPAppState:build');
    //定义route
    var widget = Router(
      routeInformationParser: _routeInformationParser,
      routerDelegate: _routerDelegate,

      ///routeInformationParser为null时可缺省,routeInformation提供者
      routeInformationProvider: PlatformRouteInformationProvider(
          initialRouteInformation: RouteInformation(location: '/')),
    );
    return MaterialApp(home: widget);
  }
}

class UPRouterDelegate extends RouterDelegate<UPRoutePath>
    with ChangeNotifier, PopNavigatorRouterDelegateMixin<UPRoutePath> {
  final GlobalKey<NavigatorState> navigatorKey;
  UPRoutePath path;
  List<MaterialPage> pages = [];
  VideoModel videoModel;

  //为Navigator设置一个key,必要的时候可以通过navigatorKey.currentState来获取到NavigatorState对象
  UPRouterDelegate() : navigatorKey = GlobalKey<NavigatorState>();

  
  Widget build(BuildContext context) {
    //构建路由栈
    pages = [
      pageWrap(HomePage(
        onJumpToDetail: (mo) {
          this.videoModel = mo;
          notifyListeners();
        },
      )),
      if (videoModel != null)
        pageWrap(
          VideoDetailPage(videoModel),
        )
    ];
    print('UPRouterDelegate:build');
    return Navigator(
      key: navigatorKey,
      pages: pages,
      onPopPage: (route, result) {
        print('Navigator:onPopPage');
        //在这里可以控制是否可以返回
        if (!route.didPop(result)) {
          return false;
        }
        return true;
      },
    );
  }

  //路由初始化时,Router 会调用setNewRoutePath 方法来更新应用程序的路由状态:
  
  Future<void> setNewRoutePath(UPRoutePath path) async {
    print('UPRouterDelegate:setNewRoutePath:$path');
    this.path = path;
  }
}

///可缺省,主要应用与web,持有RouteInformationProvider 提供的 RouteInformation ,可以将其解析为我们定义的数据类型。
class UPRouteInformationParser extends RouteInformationParser<UPRoutePath> {
  
  Future<UPRoutePath> parseRouteInformation(
      RouteInformation routeInformation) async {
    final uri = Uri.parse(routeInformation.location);
    print('UPRouteInformationParser:parseRouteInformation:uri:$uri');
    if (uri.pathSegments.length == 0) {
      return UPRoutePath.home();
    }
    return UPRoutePath.detail();
  }
}

///定义路由path
class UPRoutePath {
  final String location;

  UPRoutePath.home() : location = "/";

  UPRoutePath.detail() : location = "/detail";
}

///创建Page
pageWrap(Widget child) {
  return MaterialPage(
    key: ValueKey(child.hashCode),
    child: child,
  );
}
  • APP启动:
    1.启动;
    2.RouteInformationParser:parseRouteInformation;
    3.RouterDelegate:build;
    4.RouterDelegate:setNewRoutePath;
    5.RouterDelegate:build;
  • 打开页面:RouterDelegate:build 返回一个新的Navigator实例,并展示新的页面;
  • 返回:Navigator:onPopPage;
    在这里插入图片描述

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

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

相关文章

Threejs进阶之十八:使用ExtrudeGeometry从二维图形创建三维几何体

目录 ExtrudeGeometry类构造函数options包含的参数 使用ExtrudeGeometry从二维图形创建三维图形的基本步骤1.创建二维图形2.创建轮廓线&#xff08;outline&#xff09;3.创建材质和网格对象补充内容&#xff1a;将拉伸图形生成为线框模式 上一节我们介绍了Threejs中二维图形相…

(转载)基于模拟退火算法的TSP问题求解(matlab实现)

1 理论基础 1.1 模拟退火算法基本原理 模拟退火(simulated annealing,SA)算法的思想最早是由Metropolis等提出的。其出发点是基于物理中固体物质的退火过程与一般的组合优化问题之间的相似性。模拟退火法是一种通用的优化算法&#xff0c;其物理退火过程由以下三部分组成&am…

【6.08 代随_51day】 最佳买卖股票时机含冷冻期、买卖股票的最佳时机含手续费

最佳买卖股票时机含冷冻期、买卖股票的最佳时机含手续费 最佳买卖股票时机含冷冻期1.方法图解步骤递归代码 买卖股票的最佳时机含手续费1.方法代码 最佳买卖股票时机含冷冻期 力扣连接&#xff1a;309. 最佳买卖股票时机含冷冻期&#xff08;中等&#xff09; 1.方法 1.具体…

【uniapp 小程序实现已授权用户直接自动登录,未授权用户展示授权页面并实现一键登录】

uniapp 小程序实现已授权用户直接自动登录,未授权用户展示授权页面并实现一键登录 前言一、实现思路1. 后端接口a. LoginByCodeb. LoginMpAlic. LoginMpWx 二、最终实现流程图1.流程图在这里插入图片描述 总结 前言 项目背景 : 项目是使用 uniapp 来实现的多端小程序 , 当前实…

LVS负载均衡群集部署——DR直接路由模式

这里写目录标题 一 、 LVS-DR 工作原理二、数据包流向分析三、LVS-DR 模式的特点四、ARP问题4.1 问题一&#xff1a;IP地址冲突4.2 问题二&#xff1a;第二次再有访问请求 五、部署LVS-DR集群5.1 配置Tomcat 多实例服务器5.2 配置web节点服务器配置web1节点服务器配置Nginx七层…

00后干一年跳槽就20K,测试老油条表示真怕被这个“卷王”干掉····

在程序员职场上&#xff0c;什么样的人最让人反感呢? 是技术不好的人吗?并不是。技术不好的同事&#xff0c;我们可以帮他。 是技术太强的人吗?也不是。技术很强的同事&#xff0c;可遇不可求&#xff0c;向他学习还来不及呢。 真正让人反感的&#xff0c;是技术平平&#x…

2023-06-05 stonedb-在聚合的场景查询为空无法执行case属性-问题分析-及定位问题的思路

目录 摘要: 查询SQL: 处理该问题的思路分析: 削减查询SQL的操作符 tianmu引擎的查询SQL innodb引擎的查询SQL mysql/sql和innodb执行分析: 执行过程的trace日志: 摘出一些涉及查询执行的部分 思路分析: mysql/sql层的核心处理: Item_func_case::fix_fields 调用堆…

【OpenCV DNN】Flask 视频监控目标检测教程 07

欢迎关注『OpenCV DNN Youcans』系列&#xff0c;持续更新中 【OpenCV DNN】Flask 视频监控目标检测教程 07 3.7 OpenCVFlask实时监控人脸识别cvFlask08 项目的文件树cvFlask08 项目的Python程序cvFlask08 项目的网页模板cvFlask08 项目的运行 本系列从零开始&#xff0c;详细…

2023上海国际嵌入式展 | 如何通过人工智能驱动的自动化测试工具提升嵌入式开发效率

2023年6月14日到16日&#xff0c;龙智将在2023上海国际嵌入式展&#xff08;embedded world China 2023&#xff09;A055展位亮相。同时&#xff0c;6月14日下午3:00-3:30&#xff0c;龙智资深DevSecOps顾问巫晓光将于创新技术及应用发展论坛第二论坛区&#xff08;A325展位&am…

idea代码检查插件

1&#xff0c;SonarLint Idea 安装 Sonar 插件提升代码质量_idea sonar插件_打代码的苏比特的博客-CSDN博客 2&#xff0c;immomo Mybatis XML Mapper SQL注入漏洞发现与一键修复-----项目静态代码安全审计idea插件工具MOMO CODE SEC INSPECTOR-Java_idea sql注入 插件_North…

【蓝桥刷题】备战国赛——交通信号

蓝桥杯2022国赛真题——交通信号 &#x1f680; 每日一题&#xff0c;冲刺国赛 &#x1f680; 题目导航&#xff1a; 交通信号 &#x1f387;思路&#xff1a; d i j k s t r a dijkstra dijkstra &#x1f531;思路分析&#xff1a; 要求从一点到另一点的最短距离&#xff0…

软件测试的生命周期、Bug

一、软件测试的生命周期 1、软件的生命周期&#xff1a; 需求分析&#xff1a;分析需求是否正确、完整。 设计&#xff1a;项目的上线时间、开始开发时间、测试时间、人员... 计划&#xff1a;设计技术文档、进行UI设计... 编码&#xff1a;写代码&#xff08;实现用户需求&am…

Tomcat启动闪退的详细解决方法(捕获的野生的java1.8.0_321和野生的Tomcat8实验)

1.实验说明 本实验将采用捕获的野生的java1.8.0_321和野生的Tomcat8进行实验。而且不需要安装服务。 2.配置声明&#xff1a; java -version javac -version CATALINA_HOME 说明&#xff1a;CATALINA_HOME配置到放置到tomcat的目录 Path 说明&#xff1a;Path路径配置到tomca…

如和使用matlab实现香农编码和解码

文章目录 前言效果截图如下代码解析完整代码完结 撒花 前言 在网上看了好多 , 都是对香农进行编码的案例 , 却没有 进行解码的操作 , 今天就来补齐这个欠缺 效果截图如下 代码解析 text 你好; % 待编码的文本定义一个字符串类型的变量text&#xff0c;其值为’你好’。 [en…

2023水博会新热门:北斗时空智能 助力水利数字孪生

当“北斗”遇上“智慧水利”将会碰撞出怎样的新意&#xff1f; 6月7日&#xff0c;2023中国水博会暨第十八届中国&#xff08;国际&#xff09;水务高峰论坛正式召开。会上&#xff0c;由千寻位置提出的“北斗时空智能助力水利数字孪生”理念及相应解决方案&#xff0c;受到了与…

肠道菌群、性激素与疾病:探索它们的交互作用

谷禾健康 我们的身体中有很多不同的器官&#xff0c;组织&#xff0c;腺体等会产生许多信号分子来精确控制和影响身体的反应和活动&#xff0c;这些信号分子包括激素、神经递质、生长因子、细胞因子等。它们可以促进或抑制细胞的生长和分化&#xff0c;调节细胞间的相互作用和通…

搭建lanproxy客户端与服务端实现内网穿透

一、首先要配置java环境 1.可以使用这个&#xff0c;或者官网下载&#xff0c;或者其他版本皆可。https://download.csdn.net/download/qq_44821149/87878658 2.采用jdk-8u144-linux-x64.zip压缩包。java version 为1.8.0_144。 3.具体操作为&#xff1a; mkdir /usr/java u…

使用 Iptables 命令详细图文教程

目录 一、防火墙管理工具 二、Iptables 2.1 策略与规则链 2.2 基本的命令参数 2.2.1. 在 iptables 命令后添加 -L 参数查看已有的防火墙规则链。 2.2.2 在 iptables 命令后添加 -F 参数清空已有的防火墙规则链。 2.2.3 把 INPUT 规则链的默认策略设置为拒绝。 2.2.4…

【Web服务应用】部署LVS-DR集群

LVS-DR集群 一、LVS-DR工作原理二 、DR数据包流向分析2.1DR模式中名词解释2.2数据包流向 三、ARP问题3.1问题一&#xff1a;IP 地址冲突3.2 问题二&#xff1a;第二次再有访问请求 四、LVS-DR实战 一、LVS-DR工作原理 LVS-DR&#xff08;Linux Virtual Server Director Server&…

Pandas的groupby用法说明

Pandas的groupby用法说明 1、功能说明 按官方文档说明groupby功能&#xff0c;可以参考与SQL中的分组操作进行理解。 By “group by” we are referring to a process involving one or more of the following steps: Splitting the data into groups based on some criteri…