Flutter - 如何在使用 GetX 注册到 Get.put 后使用 Get.find 检索已实现的 class?

Flutter - How to retrieve an implemented class with Get.find after registered with Get.put using GetX?

我有一个名为 GetConnectApiHelper 的 class 实现了一个名为 IApiHelper 的抽象,我需要在 Bindings 中使用 Get.put 注册这个 class 并在抽象变量中检索实现但是当我尝试这样做,但收到有关“抽象未注册”的错误消息。

我如何才能正确注入依赖项,以便在我需要用 http、dio 等替换时轻松更改...(干净的架构)

abstract class IApiHelper {}

class GetConnectApiHelper extends GetxService implements IApiHelper {}

class SignInBinding extends Bindings {

  @override
  void dependencies() {
    Get.put(GetConnectApiHelper());
    Get.put(SignInController());
  }

}

class SignInController extends GetxController {

  final IApiHelper apiHelper = Get.find(); // This throws the exception

}

======== Exception caught by widgets library =======================================================
The following message was thrown building Builder(dirty):
"IApiHelper" not found. You need to call "Get.put(IApiHelper())" or "Get.lazyPut(()=>IApiHelper())"

GetX 根据其确切类型查找其依赖项,因此您需要使用 Get.find<GetConnectApiHelper>()

更新:

class SignInBinding extends Bindings {

  @override
  void dependencies() {
    Get.put(GetConnectApiHelper());
    Get.put(SignInController<GetConnectApiHelper>());
  }

}

class SignInController<T extends IApiHelper> extends GetxController {

  final IApiHelper apiHelper = Get.find<T>(); 

}

我找到了解决办法。我可以将接口设置为类型,然后注册我想要检索的实现。

class SignInBinding extends Bindings {

  @override
  void dependencies() {
    Get.put<IApiHelper>(GetConnectApiHelper());
    Get.put(SignInController());
  }

}

class SignInController extends GetxController {

    final IApiHelper apiHelper = Get.find();

}

print(apiHelper.runtimeType); // it prints Instance of 'GetConnectApiHelper'

或者我可以注入实现。

class SignInBinding extends Bindings {

  @override
  void dependencies() {
    Get.put<IApiHelper>(GetConnectApiHelper());
    Get.put(SignInController(apiHelper: Get.find()));
  }

}

class SignInController extends GetxController {

    final IApiHelper apiHelper;
    SignInController({required this.apiHelper})

}