GetX: Injeção de Dependências

É considerada uma boa prática para reduzir o dependência entre camadas, entidades ou módulos.

GetX: Injeção de Dependências

INTRODUÇÃO

Há várias formas de realizar a injeção de dependência em Flutter, porém iremos abordar neste artigo a injeção utilizando o GetX, mas iremos tratar de conceitos gerais que facilitará o entendimento para qualquer outra forma e após já ir direto ao ponto.

Conceito: é um padrão cujo objetivo é manter o baixo acoplamento, ou seja, manter o mínimo ou nenhuma dependência sobre algo. Assim, é considerada uma boa prática para reduzir o dependência entre camadas, entidades ou módulos.

Em Flutter, para utilizarmos a injeção de dependência, basta instanciá-lo no construtor do widget e pronto estamos utilizando a famosa injeção de dependência:

import 'package:flutter/material.dart';
import 'model/usuario.dart';

class HomePage extends StatelessWidget {
  final Usuario usuario;
  HomePage(this.usuario);
  ...
}

Muito fácil, né? Mas, se tivermos vários widgets, aí irá ficar um pouco complicado, imagine fazer a instanciar do que quero injetar em cada widget até o widget de destino? Vai ser um trabalho danado. 

Para isso existe o famoso InheritedWidget que é uma classe que permite disponibilizar informações com eficiência para todo o aplicativo. Por exemplo, temos o MediaQuery que pode ser utilizado em qualquer lugar, chamado de widget herdado.

Bom, chega de introdução e vamos ao GetX.

GETX

Há várias formas de instanciar uma classe em GetX, vamos começar:

Get.put(Controllador());

Esta é a forma pelo qual torna disponível a classe que você deseja, porém ela tem um método permanent que fica por padrão false, ou seja, sempre que não estiver utilizando-o, ele será retirado da memória. No entanto, se for verdadeiro, não deixa que o aplicativo retire ele da memória e ficará disponível para todo o aplicativo. 

Get.put(Controllador(), permanent: true);

Get.lazyPut(() => Controllador());

Diferentemente do put, o lazyPut só instancia suas classes a partir do momento que forem utilizadas, depos que a utilizou, irá ser retirada da memória.

O lazyPut tem um parâmetro chamado de fenix que por padrão é false. Ele permite reconstruir a sua classe toda vez que for preciso. Por exemplo, se eu instanciei uma classe e sai dela, por padrão o lazyPut irá retirá-la da memória, porém se eu for instanciá-la novamente irá apresentar um erro, para isso, reconstruir a classe, existe o parâmetro fenix.

Get.lazyPut(() => Controllador(), fenix: true);

Get.create(() => Controller());

create por padrão tem o parâmetro permanent true, assim, ela permite que esta instância esteja disponível em todo o aplicativo. Porém, diferente dos demais que só podem ser instanciadas uma única vez, por serem Singleton, o create gera uma nova classe toda vez que você utilizar o Get.find<Controller();

Get.putAsync(() async => await Controller());

É a opção de realizar uma instância assincrona, caso precise esperar a classe realizar uma operação que irá demorar para retornar dados.

É uma forma inteligente para inicializar seus serviços antes de executar o aplicativo Flutter, pois você pode controlar o fluxo de execução (talvez você precise carregar alguma configuração de tema). Aqui é onde você coloca a inicialização get_storage, hive, shared_pref.

Espero que tenhm gostado.