GetX中间件在绑定之前运行



这是我的Auth中间件:

import 'package:donirajkrv/controllers/user_controller.dart';
import 'package:flutter/material.dart';
import 'package:get/get.dart';
class AuthMiddleware extends GetMiddleware {
final authService = Get.find<UserController>().isUserLogged; // Here is error, this line can't find UserController
@override
int? get priority => 1;
bool isAuthenticated = false;
@override
RouteSettings? redirect(String? route) {
isAuthenticated = true;
if (isAuthenticated == false) {
return const RouteSettings(name: '/login');
}
return null;
}
}

上面的一行(我的评论在哪里(给我返回了一个错误:

════════ Exception caught by widgets library ═══════════════════════════════════
The following message was thrown building MyApp(dirty):
"UserController" not found. You need to call "Get.put(UserController())" or "Get.lazyPut(()=>UserController())"
The relevant error-causing widget was
MyApp
lib/main.dart:9

中间件让我犯了这个错误。

...
GetMaterialApp(
initialBinding: UserBinding(),
...

我试着用来解决这个问题

GetPage(
name: '/${Routes.HOME_PAGE}',
page: () => const HomePage(),
binding: UserBinding(),
middlewares: [AuthMiddleware()])

但同样的错误。

我又来了,此时有一个解决方案:p

请在您的user_controller.dart文件中添加此静态方法

static UserController get findOrInitialize{
try{
return Get.find<UserController>();
}catch(e){
//get controller is not initialized yet
Get.put(UserController());
return Get.find<UserController>();
}
}

在user_bindings.dart文件中启动控制器

而不是

@override
void dependencies() {
UserController()
}

这样做吗:

@override
void dependencies() {
UserController.findOrInitialize;
}

最后,在auth_middleware.dart文件中

像下面的例子一样启动你的控制器:

final authService = UserController.findOrInitialize;

你可以在这里找到整个例子:https://github.com/Prosa/Flutter-GetX-Bindings-Example

问题

中间件在绑定之前进行初始化。(至于为什么会发生这种情况,应与Getx讨论。(

解决方案

将Binding从方法调用initialBinding中移出,并将其放置在其他位置。这个解决方案有点麻烦,但只需一行代码即可解决问题

之前的代码

@override
Widget build(BuildContext context) {
return GetMaterialApp(
initialBinding: UserBinding(),
...

之后的代码

@override
Widget build(BuildContext context) {

Get.put<UserBinding>(UserBinding()); // ADDED
return GetMaterialApp(
// initialBinding: UserBinding(),    REMOVED
...

我已经通过初始化中间件文件中的控制器解决了这个问题。

class AuthMiddleware extends GetMiddleware {
@override
RouteSettings redirect(String route) {
final authService = Get.find<AuthService>();
Get.put(RootController(), permanent: true); // here
if (!authService.isAuth) {
return RouteSettings(name: Routes.LOGIN);
}
return null;
}
}

最新更新