使用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表示地址…...
如何在Linux系统中使用SSH进行安全连接
如何在Linux系统中使用SSH进行安全连接 SSH简介 安装SSH 在Debian/Ubuntu系统中安装 在CentOS/RHEL系统中安装 启动SSH服务 验证SSH是否安装成功 SSH配置 配置监听端口 配置登录方式 SSH客户端 安装SSH客户端 使用SSH客户端 SSH密钥认证 生成SSH密钥对 复制公钥到远程服务器…...
Pandas 数据可视化指南:从散点图到面积图的全面展示
Pandas 数据可视化指南:从散点图到面积图的全面展示 本文介绍了使用 Pandas 进行数据可视化的多种方法,包括散点图、折线图、条形图、直方图、饼图和面积图等,涵盖了常见的图表类型及其实现方式。通过提供详细的代码示例,展示了如…...
Flink + Kafka 实现通用流式数据处理详解
Flink Kafka 实现通用流式数据处理详解 在大数据时代,实时数据处理和分析成为企业快速响应市场变化、提高业务效率和优化决策的关键技术。Apache Flink和Apache Kafka作为两个重要的开源项目,在数据流处理领域具有广泛的应用。本文将深入探讨Flink和Ka…...
Docker常用命令汇总
一、Docker基础命令 启动docker:systemctl start docker关闭docker:systemctl stop docker重启docker:systemctl restart dockerdocker设置随服务启动而自启动:systemctl enable docker查看docker 运行状态:systemctl…...
【Java笔记】0-为什么学习Java
呃,当然是为了找个Java的开发工作 当然是由于Java使用的人多和它天生自带的优点了~ 主要优点有以下几点: 简单性 C语法纯净版,没有头文件、指针运算、不用分配内存 面向对象 重点放在对象与其接口上,接近人的逻辑 可移植性 …...
海外云手机是什么?对外贸电商有什么帮助?
在外贸电商领域,流量引流已成为卖家们关注的核心问题。越来越多的卖家开始利用海外云手机,通过TikTok等社交平台吸引流量,以推动商品在海外市场的销售。那么,海外云手机到底是什么?它又能为外贸电商卖家提供哪些支持呢…...
【找到了】有人知道怎么在本地用记事本方式打开Linux文本文件吗?
就类似这种,我输入一个什么命令打开文件,就能在命令窗口上弹出一个编辑器来编辑文件。只记得好像有参数-e啥的。 命令行里面如何打开文本编辑器? () 在linux命令行terminal上使用gedit直接就可以打开文本文件 那么在…...
docker 安装postgresql
前提:准备好postgresql镜像,如:镜像地址/postgres:15.8 使用docker安装posgresql: 1.docker pull 镜像地址/postgres:15.8 2.docker run -d --namepostgres -p 5432:5432 -v postgres-volume:/var/lib/postgresql/data -e PO…...
2004至2023中国分省统计面板数据-最新出炉_附下载链接
中国各省绿色税收相关数据(2007-2022年)概述 下载链接-点它👉👉👉:中国分省统计面板数据(2004-2023)-最新出炉.zip 资源介绍 绿色税收主要是指以保护环境、合理开发利用自然资源、…...
【算法】排序算法总结
文章目录 内排序一、插入排序1.1 直接插入排序1.2 折半插入排序1.3 希尔排序 二、选择排序2.1 简单选择排序2.2 堆排序 三、交换排序3.1 冒泡排序3.2 快速排序Hoare版挖坑法快速排序前后指针法快速排序的非递归 四、归并排序递归版本非递归版本 五、基数排序六、计数排序内排序…...
如何做公司自己的网站首页/百度助手下载安装
2019独角兽企业重金招聘Python工程师标准>>> 最近有一个微信端要上,需要凌晨12点上线,不可能让我等到12点切流量吧,于是早早的配置好,回家睡觉 很简单,主要在nginx这层做点处理,就行了ÿ…...
大连网站建设仟亿/网络营销常用的工具有哪些
mysql -u root -p //cmd 链接数据库,不需要打分号。http://localhost/ show databases; //打开数据库 use mysql; // show tables; //看表 看数据 增删改查 select * from user; select user,password from user; //只查用…...
顺义企业建站/如何线上推广自己产品
什么是waf Web应用防护系统 (也称:网站应用级入侵防御系统。英文:Web Application Firewall,简称: WAF)。也叫Web防火墙,主要是对Web特有入侵方式的加强防护,如DDOS防护、SQL注入、X…...
wordpress 图片链接/搜索引擎优化课程总结
【LeetCode】打卡–SQL197. 上升的温度 题目 给定一个 Weather 表,编写一个 SQL 查询,来查找与之前(昨天的)日期相比温度更高的所有日期的 Id。 --------------------------------------------- | Id(INT) | RecordDate(DATE) | …...
外网视频网站做泥声控/网络优化培训
配置JDK环境: JAVA_HOME C:\Program Files\Java\jdk1.8.0_121 CLASSPATH .;%JAVA_HOME%\lib\dt.jar;%JAVA_HOME%\lib\tools.jar Path ;%JAVA_HOME%\bin;%JAVA_HOME%\jre\bin (path是原本存在的变量,只需在后面追加这部分…...
专业营销网站建设/推广普通话主题手抄报
--用下面的方法导出就可以保证导出标准的图片文件declare id int,fn nvarchar(260),tmpfn nvarchar(260)select id2 --要导出的employeeid,fnc:\test.bmp --导出生成的文件名,tmpfnc:\tmp.bak --导出过程中使用的临时文件名--生成临时表,控制取消图片…...