GetX 实现路由拦截

GetX 中,可以通过 GetMiddleware 来实现路由拦截功能。GetMiddlewareGetX 提供的一个中间件机制,允许在路由跳转之前执行一些逻辑操作,比如登录拦截、权限验证等。

以下是实现登录拦截的详细步骤和示例代码:


1. 使用 GetMiddleware 实现路由拦截

GetMiddleware 提供了多个生命周期方法,可以在路由跳转前后执行逻辑。常用的方法包括:

  • redirect: 在路由跳转之前执行逻辑,返回一个新的路由地址以重定向。
  • onPageCalled: 在页面被调用时执行逻辑。
  • onPageDispose: 在页面被销毁时执行逻辑。

2. 示例:实现登录拦截

假设我们有一个登录页面和一个主页,未登录的用户访问主页时会被拦截并重定向到登录页面。

步骤 1:创建一个中间件类

创建一个继承自 GetMiddleware 的类,用于实现登录拦截逻辑。

import 'package:get/get.dart';

class AuthMiddleware extends GetMiddleware {
    
    
  // 优先级,数字越小优先级越高
  
  int? priority = 0;

  
  RouteSettings? redirect(String? route) {
    
    
    // 检查用户是否已登录
    bool isLoggedIn = false; // 假设未登录,实际中可以从存储中读取登录状态
    if (!isLoggedIn) {
    
    
      // 如果未登录,重定向到登录页面
      return RouteSettings(name: "/login");
    }
    // 如果已登录,允许继续访问
    return null;
  }
}

步骤 2:定义路由并添加中间件

GetMaterialAppgetPages 中为需要拦截的路由添加中间件。

import 'package:flutter/material.dart';
import 'package:get/get.dart';

import 'auth_middleware.dart';

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

class MyApp extends StatelessWidget {
    
    
  
  Widget build(BuildContext context) {
    
    
    return GetMaterialApp(
      initialRoute: "/home",
      getPages: [
        GetPage(name: "/login", page: () => LoginPage()),
        GetPage(
          name: "/home",
          page: () => HomePage(),
          middlewares: [AuthMiddleware()], // 添加中间件
        ),
      ],
    );
  }
}

步骤 3:创建登录页面和主页

登录页面
class LoginPage extends StatelessWidget {
    
    
  
  Widget build(BuildContext context) {
    
    
    return Scaffold(
      appBar: AppBar(title: Text("Login Page")),
      body: Center(
        child: ElevatedButton(
          onPressed: () {
    
    
            // 模拟登录成功
            // 实际中可以保存登录状态到本地存储或内存
            Get.offNamed("/home"); // 跳转到主页
          },
          child: Text("Login"),
        ),
      ),
    );
  }
}
主页
class HomePage extends StatelessWidget {
    
    
  
  Widget build(BuildContext context) {
    
    
    return Scaffold(
      appBar: AppBar(title: Text("Home Page")),
      body: Center(
        child: Text("Welcome to Home Page"),
      ),
    );
  }
}

3. 运行效果

  1. 如果用户未登录,直接访问 /home 会被拦截并重定向到 /login
  2. 用户在登录页面点击登录按钮后,会跳转到主页 /home

4. 其他中间件功能

除了 redirect 方法,GetMiddleware 还提供了其他方法,可以在不同的路由生命周期中执行逻辑:

  • onPageCalled: 在页面被调用时执行逻辑。
  • onPageDispose: 在页面被销毁时执行逻辑。
  • onPageBuildStart: 在页面构建开始时执行逻辑。
  • onPageBuilt: 在页面构建完成后执行逻辑。

例如:

class AuthMiddleware extends GetMiddleware {
    
    
  
  RouteSettings? redirect(String? route) {
    
    
    // 登录拦截逻辑
    return null;
  }

  
  GetPage? onPageCalled(GetPage? page) {
    
    
    print("Page is being called: ${
      
      page?.name}");
    return super.onPageCalled(page);
  }

  
  Widget onPageBuilt(Widget page) {
    
    
    print("Page has been built");
    return super.onPageBuilt(page);
  }

  
  void onPageDispose() {
    
    
    print("Page is being disposed");
    super.onPageDispose();
  }
}

5. 总结

通过 GetMiddleware,我们可以轻松实现路由拦截功能,比如登录拦截、权限验证等。以下是实现登录拦截的关键步骤:

  1. 创建一个继承自 GetMiddleware 的类,实现 redirect 方法。
  2. GetPage 中为需要拦截的路由添加中间件。
  3. 在中间件中根据业务逻辑决定是否允许访问目标页面。

GetX 的中间件机制非常灵活,可以满足大多数场景的需求,同时保持代码的简洁性和可维护性。