使用GetX实现GetPage中间件
前言
GetX 中间件(Middleware)是 GetX 框架中的一种机制,用于在页面导航时对用户进行权限控制、数据预加载、页面访问条件设置等。通过使用中间件,可以有效地控制用户的访问流程,并在适当条件下引导用户到所需页面。
这篇文文章主要介绍下GetX中间件的用法。
一、中间件的作用
中间件可用于以下场景:
- 权限控制:例如判断用户是否登录,如果未登录则跳转到登录页面。
- 数据预加载:在页面进入前进行数据的加载和检查。
- 访问条件控制:例如限制页面访问的时间或条件。
二、使用 GetMiddleware 的基本步骤
1. 创建一个继承自 GetMiddleware 的自定义中间件类。
2. 在类中重写 redirect、onPageCalled、onPageDispose 等方法,以便在导航时执行相应逻辑。
3. 在 GetPage 的 middlewares 参数中加入自定义的中间件类,实现页面访问的中间件逻辑。
三、GetMiddleware 常用方法
| 方法 | 作用说明 |
| redirect | 重定向页面到其他路由。通常用于在进入页面前进行权限判断,返回 RouteSettings 对象指定重定向页面,返回 null 则不重定向。 |
| onPageCalled | 在页面被调用时触发,适合用于进行数据预加载。 |
| onPageDispose | 在页面被销毁时触发,用于清理资源。 |
| onBindingsStart | 在页面绑定(Bindings)初始化时触发,适合进行依赖注入等操作。 |
| onPageBuildStart | 在页面构建前触发。 |
| onPageBuilt | 在页面构建完成后触发。 |
四、中间件实现登录检查的例子
我们可以通过下面的一个例子来看一下GetX中间件的用法。
在我们的实例代码中,我们会实现以下功能:
- 用户未登录时访问个人资料页面会跳转到登录页面。
- 登录后直接跳转到个人资料页面,点击退出登录后再返回登录页面。

图1.使用GetX实现中间件登陆
我们看一下具体的实现步骤:
1.创建 AuthController
AuthController 用于管理用户的登录状态,并保存状态信息(例如通过 SharedPreferences)。
import 'package:get/get.dart';
import 'package:shared_preferences/shared_preferences.dart';class AuthController extends GetxController {var isLoggedIn = false.obs;// 初始化控制器,检查登录状态Future<AuthController> init() async {final prefs = await SharedPreferences.getInstance();isLoggedIn.value = prefs.getBool('isLoggedIn') ?? false;return this;}void login() async {isLoggedIn.value = true;final prefs = await SharedPreferences.getInstance();await prefs.setBool('isLoggedIn', true); // 保存登录状态}void logout() async {isLoggedIn.value = false;final prefs = await SharedPreferences.getInstance();await prefs.remove('isLoggedIn'); // 清除登录状态}
}
2.创建中间件 AuthMiddleware
import 'package:get/get.dart';
import 'auth_controller.dart';class AuthMiddleware extends GetMiddleware {@overrideRouteSettings? redirect(String? route) {final authController = Get.find<AuthController>();// 如果用户未登录,则重定向到登录页面return authController.isLoggedIn.value ? null : const RouteSettings(name: '/login');}
}
3.设置路由
在 main.dart 中定义路由和页面导航逻辑,并将 AuthMiddleware 添加到 ProfilePage 的路由中。
import 'package:flutter/material.dart';
import 'package:get/get.dart';
import 'auth_controller.dart';
import 'auth_middleware.dart';
import 'get_middle_ware_home_page.dart';
import 'login_page.dart';
import 'profile_page.dart';void main() async {WidgetsFlutterBinding.ensureInitialized();await Get.putAsync(() => AuthController().init()); // 初始化 AuthControllerrunApp(MyApp());
}class MyApp extends StatelessWidget {@overrideWidget build(BuildContext context) {return GetMaterialApp(initialRoute: '/', // 初始路由getPages: [GetPage(name: '/', page: () => const GetMiddleWareHomePage()),GetPage(name: '/login', page: () => LoginPage()),GetPage(name: '/profile', page: () => ProfilePage(), middlewares: [AuthMiddleware()]),],);}
}
4.创建各个页面
get_middle_ware_home_page.dart
import 'package:flutter/material.dart';
import 'package:get/get.dart';class GetMiddleWareHomePage extends StatelessWidget {const GetMiddleWareHomePage({super.key});@overrideWidget build(BuildContext context) {return Scaffold(appBar: AppBar(title: const Text('Home Page')),body: Center(child: ElevatedButton(onPressed: () {Get.toNamed('/profile'); // 导航到 Profile 页面},child: const Text('Go to Profile'),),),);}
}
profile_page.dart
import 'package:flutter/material.dart';
import 'package:get/get.dart';
import 'auth_controller.dart';class ProfilePage extends StatelessWidget {const ProfilePage({super.key});@overrideWidget build(BuildContext context) {final authController = Get.find<AuthController>();return Scaffold(appBar: AppBar(title: const Text('Profile Page'),actions: [IconButton(icon: const Icon(Icons.logout),onPressed: () {authController.logout();Get.offAllNamed('/login'); // 退出后跳转到登录页面},),],),body: const Center(child: Text('Welcome to your profile!')),);}
}
login_page.dart
import 'package:flutter/material.dart';
import 'package:get/get.dart';
import 'auth_controller.dart';class LoginPage extends StatelessWidget {LoginPage({super.key});final AuthController authController = Get.find();@overrideWidget build(BuildContext context) {return Scaffold(appBar: AppBar(title: const Text('Login Page')),body: Center(child: ElevatedButton(onPressed: () {authController.login();Get.offAllNamed('/profile'); // 登录后直接跳转到 Profile 页面},child: const Text('Login'),),),);}
}
相关文章:
使用GetX实现GetPage中间件
前言 GetX 中间件(Middleware)是 GetX 框架中的一种机制,用于在页面导航时对用户进行权限控制、数据预加载、页面访问条件设置等。通过使用中间件,可以有效地控制用户的访问流程,并在适当条件下引导用户到所需页面。 这…...
Navicat 17 功能简介 | SQL 预览
Navicat 17 功能简介 | SQL 预览 随着 17 版本的发布,Navicat 也带来了众多的新特性,包括兼容更多数据库、全新的模型设计、可视化智能 BI、智能数据分析、可视化查询解释、高质量数据字典、增强用户体验、扩展MongoDB 功能、轻松固定查询结果、便捷URI …...
ubuntu、Debian离线部署gitlab
一、软件包下载 gitlab安装包下载链接 ubuntu: ubuntu/focal 适用于 ubuntu20系列 ubuntu/bionic 适用于 ubuntu18 系列 Debian: debian/buster 适用于 Debian10系列 debian/bullseye 适用于 Debian11、12系列 二、安装gitlab ubuntu需要安装一些环境…...
数据库编程 SQLITE3 Linux环境
永久存储程序数据有两种方式: 用文件存储用数据库存储 对于多条记录的存储而言,采用文件时,插入、删除、查找的效率都会很差,为了提高这些操作的效率,有计算机科学家设计出了数据库存储方式 一、数据库 数据库的基本…...
独孤思维:总有一双眼睛默默观察你做副业
01 独孤昨天在陪伴群,分享了近期小白做副业的一些困扰。 并且以自己经历作为案例,分享了一些经验和方法。 最后顺势推出xx博主的关于365条赚钱信息小报童专栏。 订阅后,可以开拓副业赚钱思路,避免走一些弯路。 甚至于&#x…...
医院信息化与智能化系统(10)
医院信息化与智能化系统(10) 这里只描述对应过程,和可能遇到的问题及解决办法以及对应的参考链接,并不会直接每一步详细配置 如果你想通过文字描述或代码画流程图,可以试试PlantUML,告诉GPT你的文件结构,让他给你对应…...
基于YOLO11/v10/v8/v5深度学习的危险驾驶行为检测识别系统设计与实现【python源码+Pyqt5界面+数据集+训练代码】
《博主简介》 小伙伴们好,我是阿旭。专注于人工智能、AIGC、python、计算机视觉相关分享研究。 ✌更多学习资源,可关注公-仲-hao:【阿旭算法与机器学习】,共同学习交流~ 👍感谢小伙伴们点赞、关注! 《------往期经典推…...
Flink CDC系列之:学习理解核心概念——Transform
Flink CDC系列之:学习理解核心概念——Transform Transform参数元数据字段函数比较函数逻辑函数字符串函数时间函数条件函数 示例添加计算列参考元数据列使用通配符投影所有字段添加过滤规则重新分配主键重新分配分区键指定表创建配置分类映射用户定义函数已知限制 …...
MyBatis-Plus:简化 CRUD 操作的艺术
一、关于MyBatis-Plus 1.1 简介 MyBatis-Plus 是一个基于 MyBatis 的增强工具,它旨在简化 MyBatis 的使用,提高开发效率。 关于Mybatis 简介 MyBatis 是一款流行的 Java 持久层框架,旨在简化 Java 应用程序与数…...
Windows on ARM编译安装openBLAS
Windows on ARM编译安装openBLAS 要求下载源码OpenBLAS可以使用LLVM工具链(clang-cl和flang)从源代码为Windows on ARM(WoA)进行构建。v0.3.24版本(预构建包)的构建和测试已通过。 要求 LLVM:版本需大于等于17.0.4 LLVM版本16及以下会生成冲突的符号(如_QQ*等)。 LL…...
FPGA编程语言VHDL与Verilog的比较分析!!!
VHDL(VHSIC硬件描述语言)和Verilog都是用于硬件描述和FPGA编程的工业标准语言。它们在语法和设计理念上存在一些差异,以下是两者的比较分析: 1. 历史背景 VHDL: 开发于1980年代初期,最初用于美国国防部的…...
C语言——八股文(笔试面试题)
1、 什么是数组指针,什么是指针数组? 数组指针:指向数组的指针 指针数组:数组中的元素都是指针 2、 什么是位段,什么是联合体 位段(Bit Field):在C语言中,允许在一个整数…...
解决 Oracle 数据库错误 ORA-12516:监听器无法找到匹配协议栈的处理程序
在使用 Oracle 数据库时,有时会遇到错误 ORA-12516,这个错误表明 Oracle 数据库的监听器无法为新的连接请求找到一个可用的处理程序,这通常是因为达到了连接数上限、配置问题或资源限制。本文将详细介绍如何解决这个问题。 一、错误描述 当…...
Flarum:简洁而强大的开源论坛软件
Flarum简介 Flarum是一款开源论坛软件,以其简洁、快速和易用性而闻名。它继承了esoTalk和FluxBB的优良传统,旨在提供一个不复杂、不臃肿的论坛体验。Flarum的核心优势在于: 快速、简单: Flarum使用PHP构建,易于部署&…...
方法+数组
1. 方法 1. 什么是方法 方法定义: // []表示可写可不写[public] [static] type name ( [type formal , type formal , ...]){方法体;[return value ;] }[修饰符] 返回值类型 方法名称([参数类型 形参 , 参数类型 形参 ...]){方法体代码;[return 返回值…...
驱动-----adc
在key1.c的基础上进行对adc1.c进行编写 首先将文件里面的key全部改为adc 再修改一下设备号 按键和adc的区别是什么,按键只需要按一下就触发了,并且不需要返回一个值出来, adc要初始化,启动,返回值 以下是裸机adc的代码: #include <s3c2440.h> #include "ad…...
js实现点击图片,使图片跟随鼠标移动(把注释打开是图片随机位置)
代码: <!DOCTYPE html> <html lang"zh-CN"><head><meta charset"UTF-8" /><meta name"viewport" content"widthdevice-width, initial-scale1.0" /><title>Document</title>&l…...
MacOS的powermetrics命令查看macbook笔记本的耗能情况,附带查看ANE的工作情况
什么是 powermetrics? powermetrics 是 macOS 系统自带的一个命令行工具,用于收集和分析系统能源消耗数据。通过它,我们可以深入了解 Mac 的硬件性能、软件行为以及能源使用情况,从而优化系统配置,提高电池续航时间。…...
字符串函数
大家好,今天我们来了解几个字符串函数 1.strcpy函数 这个函数是一个字符串复制函数,其全称为string copy,它可以将一个源字符数组的内容复制到目标字符数组中,我们需要关注几个问题,首先源字符串必须以\0…...
Java数组的地址和元素访问 C语言空指针与野指针
1. public static void main(String[] args) {int []arr{1,2,3,4,5};int numarr[0];System.out.println(num);System.out.println(arr[1]);System.out.println(arr);//[I610f87f48//[表示地址 I表示数据类型 表示间隔符号(固定格式)//10f87f48表示地址…...
Unity3D中Gfx.WaitForPresent优化方案
前言 在Unity中,Gfx.WaitForPresent占用CPU过高通常表示主线程在等待GPU完成渲染(即CPU被阻塞),这表明存在GPU瓶颈或垂直同步/帧率设置问题。以下是系统的优化方案: 对惹,这里有一个游戏开发交流小组&…...
基于当前项目通过npm包形式暴露公共组件
1.package.sjon文件配置 其中xh-flowable就是暴露出去的npm包名 2.创建tpyes文件夹,并新增内容 3.创建package文件夹...
转转集团旗下首家二手多品类循环仓店“超级转转”开业
6月9日,国内领先的循环经济企业转转集团旗下首家二手多品类循环仓店“超级转转”正式开业。 转转集团创始人兼CEO黄炜、转转循环时尚发起人朱珠、转转集团COO兼红布林CEO胡伟琨、王府井集团副总裁祝捷等出席了开业剪彩仪式。 据「TMT星球」了解,“超级…...
Springcloud:Eureka 高可用集群搭建实战(服务注册与发现的底层原理与避坑指南)
引言:为什么 Eureka 依然是存量系统的核心? 尽管 Nacos 等新注册中心崛起,但金融、电力等保守行业仍有大量系统运行在 Eureka 上。理解其高可用设计与自我保护机制,是保障分布式系统稳定的必修课。本文将手把手带你搭建生产级 Eur…...
css3笔记 (1) 自用
outline: none 用于移除元素获得焦点时默认的轮廓线 broder:0 用于移除边框 font-size:0 用于设置字体不显示 list-style: none 消除<li> 标签默认样式 margin: xx auto 版心居中 width:100% 通栏 vertical-align 作用于行内元素 / 表格单元格ÿ…...
Java面试专项一-准备篇
一、企业简历筛选规则 一般企业的简历筛选流程:首先由HR先筛选一部分简历后,在将简历给到对应的项目负责人后再进行下一步的操作。 HR如何筛选简历 例如:Boss直聘(招聘方平台) 直接按照条件进行筛选 例如:…...
人机融合智能 | “人智交互”跨学科新领域
本文系统地提出基于“以人为中心AI(HCAI)”理念的人-人工智能交互(人智交互)这一跨学科新领域及框架,定义人智交互领域的理念、基本理论和关键问题、方法、开发流程和参与团队等,阐述提出人智交互新领域的意义。然后,提出人智交互研究的三种新范式取向以及它们的意义。最后,总结…...
Kafka入门-生产者
生产者 生产者发送流程: 延迟时间为0ms时,也就意味着每当有数据就会直接发送 异步发送API 异步发送和同步发送的不同在于:异步发送不需要等待结果,同步发送必须等待结果才能进行下一步发送。 普通异步发送 首先导入所需的k…...
基于Springboot+Vue的办公管理系统
角色: 管理员、员工 技术: 后端: SpringBoot, Vue2, MySQL, Mybatis-Plus 前端: Vue2, Element-UI, Axios, Echarts, Vue-Router 核心功能: 该办公管理系统是一个综合性的企业内部管理平台,旨在提升企业运营效率和员工管理水…...
第八部分:阶段项目 6:构建 React 前端应用
现在,是时候将你学到的 React 基础知识付诸实践,构建一个简单的前端应用来模拟与后端 API 的交互了。在这个阶段,你可以先使用模拟数据,或者如果你的后端 API(阶段项目 5)已经搭建好,可以直接连…...
