【问题标题】:GetX: lifecycle methods are not called for nested controllersGetX:不为嵌套控制器调用生命周期方法
【发布时间】:2022-06-12 16:41:49
【问题描述】:

我有一个嵌套的 GetX 控制器配置,它们代表我的数据模型。它们看起来像这样(我缩短了代码以仅显示控制器结构):

class AppController extends GetxController {
  final package = PackageController().obs; 
  
  void openPackage() {
  // some code with unzipping, parsing and eventually creating instance of PackageController

  package.value = packageController;
  }
}

.

class PackageController extends GetxController {
   final rounds = RxList<RoundController>();

 void addRound() {
    rounds.add(RoundController());
  }

  void deleteRound(int index) {
    rounds.removeAt(index);
  }
}

.

class RoundController extends GetxController {
  final themes = RxList<ThemeController>();

  void addTheme() {
    themes.add(ThemeController());
  }

  void deleteTheme(int index) {
    themes.removeAt(index);
  }
}

它更深入,但这足以理解。在我的 UI 小部件中,我使用 final store = Get.put(AppController()); 访问 AppController,并通过它访问我需要的任何嵌套控制器。

现在问题来了:像onInit() 这样的生命周期方法只被AppController() 调用,而不是任何嵌套的方法。那么,我需要知道一些技巧吗,或者我以错误的方式使用 GetX,或者是什么?

【问题讨论】:

    标签: flutter flutter-getx


    【解决方案1】:

    只有在 GetX 依赖注入系统创建实例时才会调用生命周期方法。因此,您需要使用Get.put()Get.lazyPut() 创建这些实例,如下所示:

        rounds.add(Get.lazyPut(()=>RoundController()));
        themes.add(Get.lazyPut(()=> ThemeController()));
    

    更新答案:

    是的。 Get.lazyPut() 不会将控制器添加到列表中,因为它返回 void

    所以你需要为不同的实例实际使用Get.create()

        Get.create(()=>RoundController());
        Get.create(()=> ThemeController());
    

    然后:

        rounds.add(Get.find<RoundController>());
        themes.add(Get.find<ThemeController>());
    

    【讨论】:

    • 抱歉,这实际上是行不通的。 Get.lazyPut 的返回类型为 void,因此它不会添加任何内容。 Get.put 将在每次调用该函数时添加相同的控制器实例。我需要在我的RxLists 中使用不同的控制器实例。还有其他想法吗?
    • 请检查更新后的答案并确认它是否适用于您的情况。
    猜你喜欢
    • 1970-01-01
    • 2016-11-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多