GetX: Ciclo de Vida

Entenda como funciona os ciclos de vida dentro do GetX, como nascem, o que comem e quando morrem... kkk

GetX: Ciclo de Vida

No artigo de introdução, vimos que é mais tranquilo utilizar o GetX e bastante simples. Portanto, iremos ver alguns conceitos iniciais neste artigo e entender como funciona o ciclo de vida do GetX.

Para iniciar o uso go GetX, devemos primeiramente instalar a sua dependência seguindo os passos do site: (https://pub.dev/packages/get/install). A versão que estamos utilizando neste tutorial é a get: ^3.12.1.

Ciclos de Vida

Tudo em Flutter é um widget, então, basicamente, temos dois tipos de Widget os mutáveis (StatefulWidget) e imutáveis (StatelessWidget).

Para saber mais sobre os Ciclos de Vida do flutter entre aqui.

onInit()

Exerce a mesma função de initState();. Portanto, deve ser utilizado para inicializar serviços e objetos que só devem ter um valor atribuído uma única vez em toda a vida útil desse Widget (para mais informações entre aqui).

class MainController extends GetxController {
  @override
  void onInit() {
    // É a mesma coisa que initState()
    super.onInit();
  }
}

Se dermos um print("onInit()"); irá mostrar que o onInit() inicia antes do controllador:

flutter: onInit()
[GETX] "MainController" has been initialized
[GETX] "GetMaterialController" has been initialized

O que diz a documentação:

Called immediately after the widget is allocated in memory. You might use this to initialize something for the controller.

onReady()

Se quisermos iniciar uma caixa de diálogo ou iniciar uma nova página, por exemplo, no onInit() podemos ter um erro de execução, portanto, devemos utilizar o onReady() que irá esperar o Widget ser completamente renderizado para poder realizar a ação que necessitamos. 

  @override
  void onReady() {
    super.onReady();
    print("onReady()");
  }

Vejamos o que diz a documentação:

Called 1 frame after onInit(). It is the perfect place to enter navigation events, like snackbar, dialogs, or a new route, or async request

Debug:

[GETX] "GetMaterialController" has been initialized
flutter: onInit()
[GETX] "MainController" has been initialized
flutter: onReady()

Porém, há um detalhe no onReady(), ele somente é executado em um Widget do tipo StatefulWidget. Se tentar utilizá-lo no StatelessWidget, não irá funcionar.

onClose()

Pode ser usado para descartar recursos usados pelo controlador. Como eventos de fechamento ou fluxos antes que o controlador seja destruído. Ou descarte objetos que podem criar alguns vazamentos de memória, como TextEditingControllers, AnimationControllers. Também pode ser útil manter alguns dados no disco. É muito similar ao dispose().

  void onClose() {
    super.onClose();
    print("onClose()");
  }

É possível também utilizar dentro da nossa view, ao invés do controlador:

GetBuilder(
      init: MainController(),
      dispose: (_) {
        print("dispose");
      },
      initState: (_) {},
      builder: (_) {
        return ... 
      }
);

O que a documentação diz:

Called before [onDelete] method. [onClose] might be used to dispose resources used by the controller. Like closing events, or streams before the controller is destroyed. Or dispose objects that can potentially create some memory leaks, like TextEditingControllers, AnimationControllers. Might be useful as well to persist some data on disk.

Basicamente é isso. Espero que tenham gostado.