O conjunto “Controller” e “GetBuilder” permite que a aplicação se torne reativa, ou seja, ele pode atualizar um dado na página do aplicativo.
Em um primeiro momento quando comparado com “ValueNotifier“, bem simplista, o ganho é quase inexistente. Assim como “ValueNotifier” que exige instânciar o objeto e estabelecer o seu gerenciador de estado “ValueListenableBuilder“, em um primeiro olhar (incorreto), o mesmo ocorria com seus equivalentes “Controller” e “GetBuilder”, vejamos o exemplo:
Criando o “Controller”:
class Controller extends GetController { int value; Controller(this.value) { print('Controller $value foi criado'); } inc([int v = 1]) { value += v; update(); } dec([int v = 1]) { inc(-v); } }
Usando o “GetBuilder”:
Widget build(BuildContext context) { return ContainerGroup( title: 'GetBuilder', width: 150, child: GetBuilder<Controller>( // init: Controller(0), // transferido para o binding (Setup() na carga no main.dart) builder: (a) => Container( alignment: Alignment.center, width: 140, child: Row( mainAxisAlignment: MainAxisAlignment.spaceEvenly, children: [ Button( width: 40, child: Text('+'), onPressed: () => a.inc()), Text('${a.value}'), Button( width: 40, child: Text('-'), onPressed: () => a.dec()), ]), )), ); }
onInit / onClose – Controller
O “Controller” ganho dois eventos que ser sobrescrito (@override) permindo uma separação do código um pouco mais agrupado. onInit é chamado ao criar o GetBuilder (que é um StatefulWidget) equando que onClose é chamado ao ser encerrado.
Os eventos estão encapsulados no “initState” e “dispose” de um StatefulWidget/State, ou seja, então aqueles códigos de inicialização e finalização podem ser transferidos para o “Controller”, entregando mais separação de código ao controller melhorando a leitura e manutenção.
GetBuilder turbinado – sem instanciar o controller
É aqui que o GetBuilder ganha força, NÃO requer uma instância do controller (requer somente na primeira chamada).
Neste ponto simplifica o uso de “controllers” que são utilizados em diferentes classes; o parâmetro “global:true” permite utilizar ou compartilhar a mesma instância do objeto, funcionando como um singleton.
O “GetBuilder” reaproveita o “controller” da primeira chamada armazenada em uma pilha “global”, reutilizando-o nas próximas chamadas.
Como agora a instância é global é bem vindo a propriedade “autoRemove” do “GetBuilder” instruindo a destruição da instância criada sem a necessidade de uma chamada direta ao “dispose”.