Persistindo o estado do seu Bloc com hydrated_bloc

Rodrigo Bastos
3 min readFeb 17, 2020

--

Fala galera, já falei sobre flutter_bloc, sobre testes com ele e para finalizar esta série de artigos sobre bloc com Flutter resolvi falar sobre um package muito interessante que tem a função de guardar o estado do seu bloc de maneira que quando você abrir o seu aplicativo novamente ele possa carregar novamente o estado persistido do bloc e você possa “continuar de onde você parou”.

O package a qual estou me referindo é o hydrated_bloc (https://github.com/felangel/hydrated_bloc), e é mais uma das maravilhas criadas pelo Felix Angelov (https://github.com/felangel/). Se você fica frustado quando você inicia o aplicativo e todos os dados que você tinha no bloc são perdidos e você precisa começar do zero novamente, não deixe de ler esse artigo pois no final dele você vai conseguir fazer isto de maneira fácil e elegante.

Para exemplificar o uso do package iremos continuar o projeto feito na parte 1 e 2 do artigo, refatorando-o para utilizar o hydrated_bloc. Nosso objetivo é que ao fechar o aplicativo e depois abrir de novo possamos restaurar os mesmo tiles que tinhamos anteriormente.

Vamos lá, hands on the code!!!

Primeira coisa a fazer é declarar no pubspec.yaml a dependência do hydrated_bloc.

Para utilizar o hydrated_bloc o seu bloc tem que estender ele, então para cada bloc que você deseja armazenar o estado dele deve fazê-lo estender HydratedBloc, como mostrado no exemplo abaixo:

Feito isso, você tem como obrigação que implementar dois métodos: toJson e fromJson. A implementação destes métodos vai ser você ensinando quais informações você deseja armazenar e como armazenar e resgatar elas. No método toJson eu vou receber um estado e vou serializar as informações que eu desejar paa resgatar posteriormente. A implementação do toJson para esse projeto ficou assim: basicamente eu retorno um json com a chave ‘tiles’ que guarda a lista de todos os tiles que eu já adicionei.

Aqui foi necessário refatorar o método que criava os tiles, pois como agora eu preciso serializar esses caras, achei mais fácil criar variaveis adicionais no objeto Tile, variáveis estas que vão guardar R, G, B e opacity da cor aleatória que eu vou gerar. Fiz isso pois é bem mais fácil serializar 3 inteiros e um double do que um objeto Color.

Feito isso, precisamos implementar agora o método fromJson, este método vai receber um json com os dados que foram armazenados, então seu trabalho é converter estes dados para os dados que vão ser efetivamente utilizados pelo seu bloc e retornar um estado do bloc com estes dados.

Como eu tinha anteriormente adicionado todos os tiles na propriedade ‘tiles’ do json ficou bem fácil resgatar eles aqui e transformar em objetos do tipo Tile que serão passados para o estado inicial do bloc.

Você deve ter notado que anteriormente que nosso InitialGridState não recebia nenhum parâmetro. Agora porém, temos que passar uma lista de tiles (se existirem) para o nosso estado inicial, para assim que o nosso app abrir todos os tiles que tinhamos previamente possam ser restaurados.

Para que o hydrated_bloc possa fazer sua magia precisamos chamar no initState do nosso bloc o initState do hydrated_bloc. Mas precisamos nos atentar que existe a possibilidade de não termos nenhum dado ainda, neste caso queremos que o estado seja o estado InitialGridState.

E é só isso. Essa é mais uma das coisas que me fazem achar sensacional o package flutter_bloc e tudo que envolve ele. Com pouquíssimos passos conseguimos fazer algo que daria um trabalho absurdo se fossemos fazer de outra forma.

Então é isso pessoal, se vocês tiverem alguma sugestão de assunto, posso tratar de qualquer assunto que vocês desejarem.

--

--