Home > database >  GetX: lifecycle methods are not called for nested controllers
GetX: lifecycle methods are not called for nested controllers

Time:04-18

I have a configuration of nested GetX controllers, which represent my data model. They look like this (I shortened the code to show only controllers structure):

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);
  }
}

It goes deeper, but that's enough for understanding. In my UI widgets I access AppController with final store = Get.put(AppController()); and through it I have access to any nested controller I need.

Now to the problem: lifecycle methods like onInit() are called only for AppController() and not for any of the nested ones. So, is there some trick I need to know, or I use GetX in a wrong way, or what?

CodePudding user response:

The lifecycle methods are called only if the GetX dependency injection system creates the instances. Therefore you need to create these instances with Get.put() or Get.lazyPut() like this:

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