在 GetX
中,可以通过 GetMiddleware
来实现路由拦截功能。GetMiddleware
是 GetX
提供的一个中间件机制,允许在路由跳转之前执行一些逻辑操作,比如登录拦截、权限验证等。
以下是实现登录拦截的详细步骤和示例代码:
GetMiddleware
实现路由拦截GetMiddleware
提供了多个生命周期方法,可以在路由跳转前后执行逻辑。常用的方法包括:
redirect
: 在路由跳转之前执行逻辑,返回一个新的路由地址以重定向。onPageCalled
: 在页面被调用时执行逻辑。onPageDispose
: 在页面被销毁时执行逻辑。假设我们有一个登录页面和一个主页,未登录的用户访问主页时会被拦截并重定向到登录页面。
创建一个继承自 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;
}
}
在 GetMaterialApp
的 getPages
中为需要拦截的路由添加中间件。
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()], // 添加中间件
),
],
);
}
}
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"),
),
);
}
}
/home
会被拦截并重定向到 /login
。/home
。除了 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();
}
}
通过 GetMiddleware
,我们可以轻松实现路由拦截功能,比如登录拦截、权限验证等。以下是实现登录拦截的关键步骤:
GetMiddleware
的类,实现 redirect
方法。GetPage
中为需要拦截的路由添加中间件。GetX
的中间件机制非常灵活,可以满足大多数场景的需求,同时保持代码的简洁性和可维护性。