Fala, Dev! Tudo bem? Trazendo mais este artigo com um questionamento que você pode aacabar fazendo em algum momento. :D

Conforme apresentado nas aulas intro de GetX, o lazyPut tem um funcionamento de inserção de objetos na memória de forma tardia, trazendo um ganho a mais na performance, o que nos faz pensar o seguinte: "Será que posso então adicionar o lazyPut em todos os meus controllers?".

Para responder esta pergunta precisamos também nos atentar a outro comportamento desse tipo de inserção que precisa ser levado em consideração.

Quando estamos em uma tela e recuperamos o objeto da memória que foi inserido através do lazyPut e em seguida vamos para uma outra tela, utilizando por exemplo do Get.offAllNamed, este objeto que foi injetado (Para podermos recuperar de qualquer lugar) é removido da memória, para ser ainda mais performático. Isso em determinados momentos pode acabar resultando em um funcionamento que não gostaríamos.

Caso tente adicionar o lazyPut em todos os controladores e faça a navegação pelo PageView visualizando as telas de produtos, carrinho, pedidos ou perfil você terá um problema, porque assim como abrir uma nova tela, o PageView remove da memória a tela que estava antes sendo apresentada sempre que você pagina para outra, o que faz com que o controller seja removido da memória (Se usar o lazyPut). Então quando voltar terá um erro indicando que o objeto não pôde ser recuperado/encontrado no Get.find();

Para resolvermos este comportamento basta que no momento em que for adicionar o lazyPut você também adicione o atributo fenix como true. Exemplo:

class CartBinding extends Bindings {
  @override
  void dependencies() {
    Get.lazyPut(
      () => CartController(),
      fenix: true,
    );
  }
}

Assim como na mitologia a fenix sempre que morria renascia das cinzas, e esse atributo faz o mesmo com o controller que foi removido/morto da memória! Legal, não é? :D

Caso adicione este atributo não terá problemas, mas com uma ressalva: Sempre que abrir o seu carrinho, por exemplo, o mesmo será iniciado do zero, já que irá abrir um novo objeto do tipo cartController. O mesmo se aplica para todos os outros controladores, poderá ter um pequeno delay na apresentação dos dados, visto que os controladores precisam ser novamente recuperados e iniciados.