使用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表示地址…...
RestClient
什么是RestClient RestClient 是 Elasticsearch 官方提供的 Java 低级 REST 客户端,它允许HTTP与Elasticsearch 集群通信,而无需处理 JSON 序列化/反序列化等底层细节。它是 Elasticsearch Java API 客户端的基础。 RestClient 主要特点 轻量级ÿ…...
脑机新手指南(八):OpenBCI_GUI:从环境搭建到数据可视化(下)
一、数据处理与分析实战 (一)实时滤波与参数调整 基础滤波操作 60Hz 工频滤波:勾选界面右侧 “60Hz” 复选框,可有效抑制电网干扰(适用于北美地区,欧洲用户可调整为 50Hz)。 平滑处理&…...

基于uniapp+WebSocket实现聊天对话、消息监听、消息推送、聊天室等功能,多端兼容
基于 UniApp + WebSocket实现多端兼容的实时通讯系统,涵盖WebSocket连接建立、消息收发机制、多端兼容性配置、消息实时监听等功能,适配微信小程序、H5、Android、iOS等终端 目录 技术选型分析WebSocket协议优势UniApp跨平台特性WebSocket 基础实现连接管理消息收发连接…...
《Playwright:微软的自动化测试工具详解》
Playwright 简介:声明内容来自网络,将内容拼接整理出来的文档 Playwright 是微软开发的自动化测试工具,支持 Chrome、Firefox、Safari 等主流浏览器,提供多语言 API(Python、JavaScript、Java、.NET)。它的特点包括&a…...
连锁超市冷库节能解决方案:如何实现超市降本增效
在连锁超市冷库运营中,高能耗、设备损耗快、人工管理低效等问题长期困扰企业。御控冷库节能解决方案通过智能控制化霜、按需化霜、实时监控、故障诊断、自动预警、远程控制开关六大核心技术,实现年省电费15%-60%,且不改动原有装备、安装快捷、…...

HBuilderX安装(uni-app和小程序开发)
下载HBuilderX 访问官方网站:https://www.dcloud.io/hbuilderx.html 根据您的操作系统选择合适版本: Windows版(推荐下载标准版) Windows系统安装步骤 运行安装程序: 双击下载的.exe安装文件 如果出现安全提示&…...

IoT/HCIP实验-3/LiteOS操作系统内核实验(任务、内存、信号量、CMSIS..)
文章目录 概述HelloWorld 工程C/C配置编译器主配置Makefile脚本烧录器主配置运行结果程序调用栈 任务管理实验实验结果osal 系统适配层osal_task_create 其他实验实验源码内存管理实验互斥锁实验信号量实验 CMISIS接口实验还是得JlINKCMSIS 简介LiteOS->CMSIS任务间消息交互…...

初探Service服务发现机制
1.Service简介 Service是将运行在一组Pod上的应用程序发布为网络服务的抽象方法。 主要功能:服务发现和负载均衡。 Service类型的包括ClusterIP类型、NodePort类型、LoadBalancer类型、ExternalName类型 2.Endpoints简介 Endpoints是一种Kubernetes资源…...
Webpack性能优化:构建速度与体积优化策略
一、构建速度优化 1、升级Webpack和Node.js 优化效果:Webpack 4比Webpack 3构建时间降低60%-98%。原因: V8引擎优化(for of替代forEach、Map/Set替代Object)。默认使用更快的md4哈希算法。AST直接从Loa…...

华为OD机试-最短木板长度-二分法(A卷,100分)
此题是一个最大化最小值的典型例题, 因为搜索范围是有界的,上界最大木板长度补充的全部木料长度,下界最小木板长度; 即left0,right10^6; 我们可以设置一个候选值x(mid),将木板的长度全部都补充到x,如果成功…...