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.