广告
返回顶部
首页 > 资讯 > 移动开发 >Flutter实现页面路由及404路由拦截
  • 382
分享到

Flutter实现页面路由及404路由拦截

2024-04-02 19:04:59 382人浏览 独家记忆
摘要

为什么要使用路由 在之前我们的代码中,页面跳转使用的代码如下所示: Navigator.of(context).push( MaterialPageRoute(builde

为什么要使用路由

在之前我们的代码中,页面跳转使用的代码如下所示:


 Navigator.of(context).push(
  MaterialPageRoute(builder: (context) => LoginPage()),
);

开发过程中,随着页面的增加,如果继续使用这种方式会有如下缺陷:

  • 代码耦合严重:涉及到页面跳转的地方就需要插入页面的构造函数,意味着需要知道其他页面的构建方式。
  • 不易维护:一旦某个页面发生了变化,需要将涉及到该页面的跳转全部改变。
  • 权限控制不方便:假设某些页面需要授权后才可以访问,需要在各个地方插入权限判断。

Flutter路由介绍

首先说一下,本篇的路由介绍是 Flutter 1.0的实现方式,Flutter 2.0对路由做了很大的改动,使用了声明式方式重构了路由,使用起来会更为复杂。在 Flutter 的 MaterialApp提供了路由配置参数,当使用路由配置后,MaterialApp 的构造形式如下所示:


return MaterialApp(
  //其他参数...
  navigatorKey: //全局导航状态Key,
  onGenerateRoute: //路由改变响应方法,
  initialRoute: //初始化路由路径,
);
  • navigatorKey是一个GlobalKey<NavigatorState>对象,用于全局存储导航的状态。
  • onGenerateRoute为一个路由拦截器,当路由发生改变时,该方法会被调用,从而可以根据路由参数返回不同的页面,或者进行路由拦截。
  • initialRoute为初始化路由路径,一般为启动页或首页的路径。

页面结构与逻辑

为了演示路由的使用,我们使用了四个页面:

  • AppHomePage :首页,与之前的章节的页面框架一样,路由路径为“/”;
  • Splash:启动页,只有一个图片,实际使用过程可以用于加载引导页,广告或其他用途。页面停留2秒后切换到首页。
  • LoginPage:登录页,用于演示点击登录按钮通过路由切换到登录页。
  • NotFound:即404页面,当路由表中没有匹配的路径时,跳转到404页面。

这里的路由跳转分为了两种,一是从启动页跳转到首页,这种跳转不可返回的;二是正常的调整,可以点击返回按钮返回到上一级。在 Flutter 中提供不同的方法应对这两种情况。

实现关键代码

首先是路由表和路由拦截响应的实现,在 routers文件夹新建 router_table.dart 文件,代码如下:


import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart';
import '../app.dart';
import '../login.dart';
import '../not_found.dart';
import '../splash.dart';

class RouterTable {
  static String splashPath = 'splash';
  static String loginPath = 'login';
  static String homePath = '/';
  static String notFoundPath = '404';

  static Map<String, WidgetBuilder> routeTables = {
    //404页面
    notFoundPath: (context) => NotFound(),
    //启动页
    splashPath: (context) => Splash(),
    //登录
    loginPath: (context) => LoginPage(),
    //首页
    homePath: (context) => AppHomePage(),
  };

  ///路由拦截
  static Route onGenerateRoute<T extends Object>(RouteSettings settings) {
    return CupertinoPageRoute<T>(
      settings: settings,
      builder: (context) {
        String name = settings.name;
        if (routeTables[name] == null) {
          name = notFoundPath;
        }

        Widget widget = routeTables[name](context);

        return widget;
      },
    );
  }
}

这里全部使用了静态属性和静态方法,是为了可以直接从过类名访问属性和方法,而无需反复构建对象。这样,路由访问的时候也可以通过类名的静态属性直接访问,可以避免拼写错误。有了这个类了后,App 的所有页面都可以通过这个类集中管理,从而避免多处维护了。

这里关键的是onGenerateRoute方法,该方法接收了一个 RouteSettings 对象,该对象会有个 name 属性包含路由路径名称,同时还有个 arguments 用于携带路由参数。可以通过这个属性来与路由表的页面进行匹配。若匹配到则返回相应的页面;若没有匹配到,则路由到404页面。同时,若需要做权限控制,也可以在这里拦截,比如定位到403页面或直接提醒无访问权限。

接下来就是改造 main.dart 文件,在构建 MaterialApp 时使用对应的理由配置:


import 'package:flutter/material.dart';
import 'routers/router_table.dart';

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

class MyApp extends StatelessWidget {
  final GlobalKey navigationKey = GlobalKey<NavigatorState>();

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      navigatorKey: navigationKey,
      onGenerateRoute: RouterTable.onGenerateRoute,
      initialRoute: RouterTable.splashPath,
    );
  }
}

这里会发现在 main.dart中我们无需再通过 import引入相关的页面 了,而是直接配置路由的配置属性即可。

页面路由跳转

页面路由跳转更为简便,在 Flutter 中的 NavigatorState 中分别提供了 pushNamed 方法和pushReplacementNamed 方法,前者会在导航栏有返回按钮,后者是使用路由后的页面直接替换当前页面,适用于启动页的调整。
在启动页中未来停留几秒,使用了一个定时器,在2秒后再进行跳转,实际可以用于做一些预加载资源的提示或者广告展示。


@override
void didChangeDependencies() {
  super.didChangeDependencies();
  if (!_initialized) {
    _initialized = true;
    Timer(const Duration(milliseconds: 2000), () {
      Navigator.of(context).pushReplacementNamed(RouterTable.homePath);
    });
  }
}

普通页面的跳转直接使用 pushNamed 即可,若要返回上一级,则使用 pop 方法。pushpop方法均可以携带参数,下一篇我们再来介绍如何处理路由参数。这里我们特意加了一个错误的路由演示404跳转:


body: Center(
  child: Column(
    mainAxisAlignment: MainAxisAlignment.center,
    children: [
      ButtonUtil.primaryTextButton('登录', () {
        Navigator.of(context).pushNamed(RouterTable.loginPath);
      }, context),
      SizedBox(
        height: 10,
      ),
      ButtonUtil.primaryTextButton('404', () {
        Navigator.of(context).pushNamed('errorRoute');
      }, context),
    ],
  ),
),

最终运行效果如下图所示。

路由及拦截.gif

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持编程网。

--结束END--

本文标题: Flutter实现页面路由及404路由拦截

本文链接: https://www.lsjlt.com/news/158665.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • Flutter实现页面路由及404路由拦截
    为什么要使用路由 在之前我们的代码中,页面跳转使用的代码如下所示: Navigator.of(context).push( MaterialPageRoute(builde...
    99+
    2022-11-12
  • Flutter app页面路由以及路由拦截的实现
    目录为什么要使用路由 Flutter路由介绍 页面结构与逻辑 实现关键代码 页面路由跳转 为什么要使用路由 在之前我们的代码中,页面跳转使用的代码如下所示: Navigato...
    99+
    2022-11-12
  • Flutter路由守卫拦截的实现
    目录为什么要使用路由Flutter路由守卫拦截的实现一、路右表管理二、实现路由守卫为什么要使用路由 在之前我们的代码中,页面跳转使用的代码如下所示: Navigator.of(con...
    99+
    2022-11-13
  • react路由守卫的实现(路由拦截)
    react不同于vue,通过在路由里设置meta元字符实现路由拦截。在使用 Vue ,框架提供了路由守卫功能,用来在进入某个路有前进行一些校验工作,如果校验失败,就跳转到 404 或...
    99+
    2022-11-12
  • vue如何设置路由拦截及页面跳转
    这篇文章主要为大家展示了“vue如何设置路由拦截及页面跳转”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“vue如何设置路由拦截及页面跳转”这篇文章吧。路由设置:...
    99+
    2022-10-19
  • vue路由实现登录拦截
    目录一、概述二、路由导航守卫实现登录拦截一、概述 在项目开发中每一次路由的切换或者页面的刷新都需要判断用户是否已经登录,前端可以判断,后端也会进行判断的,我们前端最好也进行判断。 ...
    99+
    2022-11-11
  • Flutter如何完成路由拦截,实现权限管理
    目录相关文章 fluro 路由拦截思路 定义路由时拦截 跳转时拦截 之前几篇介绍了 fluro 的路由管理和转场动画,本篇介绍如何完成路由拦截,进而实现权限管理。“此路是我开,此树...
    99+
    2022-11-12
  • Flutter的路由router-页面跳转
    文章目录 概念介绍基本路由(Basic Routing)跳转到某个页面弹出页面 命名路由(Named Routing)第三方路由管理库(Third-Party Routing Libr...
    99+
    2023-09-20
    flutter 路由 router 页面跳转 intent
  • React路由拦截模式及withRouter示例详解
    目录一、路由拦截二、路由模式三、withRouter一、路由拦截 在前面两篇 路由博客基础上,我们将ReactRouter.js的我的profile路由设置成路由拦截的: <R...
    99+
    2022-11-13
    React路由拦截模式withRouter React路由
  • vue中怎么实现一个路由拦截器和请求拦截器
    本篇文章给大家分享的是有关vue中怎么实现一个路由拦截器和请求拦截器,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。路由拦截器已路由为导向rou...
    99+
    2022-10-19
  • ReactRouterV5:使用HOC组件实现路由拦截功能
    目录前言一、创建一个HOC组件二、使用withRouter组件三、实现路由拦截前言 在Web应用程序中,需要对一些页面进行访问限制,只允许已经登录的用户访问受保护的页面。React ...
    99+
    2023-03-14
    React Router 路由拦截 React 路由拦截
  • vue3使用vue-router及路由权限拦截方式
    目录使用vue-router及路由权限拦截vue3使用vue-router讲解使用vue-router及路由权限拦截 vue3 使用 vue-router 的方式和 vue2 基本一...
    99+
    2022-11-13
  • vue3怎么使用vue-router及路由权限拦截
    这篇文章主要讲解了“vue3怎么使用vue-router及路由权限拦截”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“vue3怎么使用vue-router及路由权限拦截”吧!使用vue-rou...
    99+
    2023-06-30
  • flutter 路由机制的实现
    目录实现基础 _routeNamed _flushHistoryUpdates add push pop remove 总结 整个 flutter 应用的运行都只是基于原生...
    99+
    2022-11-12
  • Flutter路由传递参数及解析实现
    上一篇Flutter页面路由及404路由拦截实现介绍了使用路由来实现页面的跳转,从而简化页面之间的耦合,并可以实现路由拦截。在实际开发中,我们经常会需要在页面跳转的时候携带路由参数...
    99+
    2022-11-12
  • angular如何实现未登录状态拦截路由跳转
    这篇文章给大家分享的是有关angular如何实现未登录状态拦截路由跳转的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。使用angularjs的但页面应用时,由于是本地路由在控制页面...
    99+
    2022-10-19
  • Flutter Navigator路由传参怎么实现
    今天小编给大家分享一下Flutter Navigator路由传参怎么实现的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下...
    99+
    2023-06-30
  • 使用vue路由怎么实现一个登录拦截功能
    本篇文章给大家分享的是有关使用vue路由怎么实现一个登录拦截功能,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。一、概述vue-router提供了导航钩子:全局前置导航钩子 be...
    99+
    2023-06-14
  • vue-router中怎么实现单页面路由
    本篇文章给大家分享的是有关vue-router中怎么实现单页面路由,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。vue中,有一个类库叫做vue...
    99+
    2022-10-19
  • ASP.NETCore中的Razor页面实现路由功能
    在服务器端 Web 应用程序框架中,其中非常重要的设计是开发人员如何将URL与服务器上的资源进行匹配,以便正确的处理请求。最简单的方法是将 URL 映射到磁盘上的物理文件,在 Raz...
    99+
    2022-11-13
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作