• 使用GetX实现GetPage中间件


    前言

            GetX 中间件(Middleware)是 GetX 框架中的一种机制,用于在页面导航时对用户进行权限控制、数据预加载、页面访问条件设置等。通过使用中间件,可以有效地控制用户的访问流程,并在适当条件下引导用户到所需页面。

            这篇文文章主要介绍下GetX中间件的用法。

    一、中间件的作用

            中间件可用于以下场景:

    1. 权限控制:例如判断用户是否登录,如果未登录则跳转到登录页面。
    2. 数据预加载:在页面进入前进行数据的加载和检查。
    3. 访问条件控制:例如限制页面访问的时间或条件。

    二、使用 GetMiddleware 的基本步骤

    1. 创建一个继承自 GetMiddleware 的自定义中间件类。

    2. 在类中重写 redirect、onPageCalled、onPageDispose 等方法,以便在导航时执行相应逻辑。

    3. 在 GetPage 的 middlewares 参数中加入自定义的中间件类,实现页面访问的中间件逻辑。

    三、GetMiddleware 常用方法

    方法

    作用说明
    redirect重定向页面到其他路由。通常用于在进入页面前进行权限判断,返回 RouteSettings 对象指定重定向页面,返回 null 则不重定向。
    onPageCalled在页面被调用时触发,适合用于进行数据预加载。
    onPageDispose在页面被销毁时触发,用于清理资源。
    onBindingsStart在页面绑定(Bindings)初始化时触发,适合进行依赖注入等操作。
    onPageBuildStart在页面构建前触发。
    onPageBuilt

    在页面构建完成后触发。

    四、中间件实现登录检查的例子

            我们可以通过下面的一个例子来看一下GetX中间件的用法。

            在我们的实例代码中,我们会实现以下功能:

    1. 用户未登录时访问个人资料页面会跳转到登录页面。
    2. 登录后直接跳转到个人资料页面,点击退出登录后再返回登录页面。

            

    图1.使用GetX实现中间件登陆

    我们看一下具体的实现步骤:

    1.创建 AuthController

            AuthController 用于管理用户的登录状态,并保存状态信息(例如通过 SharedPreferences)。

    1. import 'package:get/get.dart';
    2. import 'package:shared_preferences/shared_preferences.dart';
    3. class AuthController extends GetxController {
    4. var isLoggedIn = false.obs;
    5. // 初始化控制器,检查登录状态
    6. Future init() async {
    7. final prefs = await SharedPreferences.getInstance();
    8. isLoggedIn.value = prefs.getBool('isLoggedIn') ?? false;
    9. return this;
    10. }
    11. void login() async {
    12. isLoggedIn.value = true;
    13. final prefs = await SharedPreferences.getInstance();
    14. await prefs.setBool('isLoggedIn', true); // 保存登录状态
    15. }
    16. void logout() async {
    17. isLoggedIn.value = false;
    18. final prefs = await SharedPreferences.getInstance();
    19. await prefs.remove('isLoggedIn'); // 清除登录状态
    20. }
    21. }

    2.创建中间件 AuthMiddleware

    1. import 'package:get/get.dart';
    2. import 'auth_controller.dart';
    3. class AuthMiddleware extends GetMiddleware {
    4. @override
    5. RouteSettings? redirect(String? route) {
    6. final authController = Get.find();
    7. // 如果用户未登录,则重定向到登录页面
    8. return authController.isLoggedIn.value ? null : const RouteSettings(name: '/login');
    9. }
    10. }

    3.设置路由

            在 main.dart 中定义路由和页面导航逻辑,并将 AuthMiddleware 添加到 ProfilePage 的路由中。

    1. import 'package:flutter/material.dart';
    2. import 'package:get/get.dart';
    3. import 'auth_controller.dart';
    4. import 'auth_middleware.dart';
    5. import 'get_middle_ware_home_page.dart';
    6. import 'login_page.dart';
    7. import 'profile_page.dart';
    8. void main() async {
    9. WidgetsFlutterBinding.ensureInitialized();
    10. await Get.putAsync(() => AuthController().init()); // 初始化 AuthController
    11. runApp(MyApp());
    12. }
    13. class MyApp extends StatelessWidget {
    14. @override
    15. Widget build(BuildContext context) {
    16. return GetMaterialApp(
    17. initialRoute: '/', // 初始路由
    18. getPages: [
    19. GetPage(name: '/', page: () => const GetMiddleWareHomePage()),
    20. GetPage(name: '/login', page: () => LoginPage()),
    21. GetPage(name: '/profile', page: () => ProfilePage(), middlewares: [AuthMiddleware()]),
    22. ],
    23. );
    24. }
    25. }

    4.创建各个页面

     get_middle_ware_home_page.dart

    1. import 'package:flutter/material.dart';
    2. import 'package:get/get.dart';
    3. class GetMiddleWareHomePage extends StatelessWidget {
    4. const GetMiddleWareHomePage({super.key});
    5. @override
    6. Widget build(BuildContext context) {
    7. return Scaffold(
    8. appBar: AppBar(title: const Text('Home Page')),
    9. body: Center(
    10. child: ElevatedButton(
    11. onPressed: () {
    12. Get.toNamed('/profile'); // 导航到 Profile 页面
    13. },
    14. child: const Text('Go to Profile'),
    15. ),
    16. ),
    17. );
    18. }
    19. }

    profile_page.dart

    1. import 'package:flutter/material.dart';
    2. import 'package:get/get.dart';
    3. import 'auth_controller.dart';
    4. class ProfilePage extends StatelessWidget {
    5. const ProfilePage({super.key});
    6. @override
    7. Widget build(BuildContext context) {
    8. final authController = Get.find();
    9. return Scaffold(
    10. appBar: AppBar(
    11. title: const Text('Profile Page'),
    12. actions: [
    13. IconButton(
    14. icon: const Icon(Icons.logout),
    15. onPressed: () {
    16. authController.logout();
    17. Get.offAllNamed('/login'); // 退出后跳转到登录页面
    18. },
    19. ),
    20. ],
    21. ),
    22. body: const Center(child: Text('Welcome to your profile!')),
    23. );
    24. }
    25. }

    login_page.dart

    1. import 'package:flutter/material.dart';
    2. import 'package:get/get.dart';
    3. import 'auth_controller.dart';
    4. class LoginPage extends StatelessWidget {
    5. LoginPage({super.key});
    6. final AuthController authController = Get.find();
    7. @override
    8. Widget build(BuildContext context) {
    9. return Scaffold(
    10. appBar: AppBar(title: const Text('Login Page')),
    11. body: Center(
    12. child: ElevatedButton(
    13. onPressed: () {
    14. authController.login();
    15. Get.offAllNamed('/profile'); // 登录后直接跳转到 Profile 页面
    16. },
    17. child: const Text('Login'),
    18. ),
    19. ),
    20. );
    21. }
    22. }

  • 相关阅读:
    【IEEE出版】工业自动化,机器人与控制工程国际会议(IARCE 2022)
    用户订阅付费如何拆解分析?看这篇就够了
    vue datav dv-scroll-board
    对内 DDD 对外 API 之—对外 API 的设计理念
    Leetcode(665)——非递减数列
    Docker:容器
    健康管理信息系统
    Unity UI Toolkit学习笔记-Runtime UI 案例实践
    [国产MCU]-W801开发实例-MQTT客户端通信
    gdb常用调试命令 + 多进程调试命令
  • 原文地址:https://blog.csdn.net/ZCC361571217/article/details/143378411