DEV Community

Nathan Silva
Nathan Silva

Posted on

Como manter o estado de uma tela ao chamar deeplink no xamarin C#

O que é deeplink?

De forma resumida, o deeplink são chamadas de aplicativos para outros aplicativos para a realização de ações especificas.
Exemplo: No ifood, quando terminamos de selecionar os nossos produtos e finalizamos com a forma de pagamento Cartao Nubank e finalizamos o aplicativo do banco é aberto já mostrando os valores e informações. Ao fazer o pagamento, o app da nubank retorna ao ifood finalizando assim o pedido.

Problema

Nesse contexto, ao fazer essa chamada para um app externo, pode ser o que o app de origem seja "destruído" e juntamente com ele todas as informações armazenadas em memória. Abaixo eu vou mostrar como podemos manter o estado do aplicativo de origem e retornar ao ponto em que paramos.

Solução 1

Primeiramente vamos ter certeza que de que toda a informação vinda do Bundle está sendo perdida. No método OnCreate na Intent, verifique se o valor do parâmetro está vazio.

Image description

Se estiver nulo, vá para a solução 2, caso contrário siga o passo abaixo!

Como ainda estamos com algumas informações do Bundle armazenadas, basta a gente salvar o estado do que quisermos e posteriormente restaurar o estado. Vamos usar o metodo para salvar o estado.

protected override void OnSaveInstanceState(Bundle outState)
{
base.OnSaveInstanceState(outState);
// Salvar os dados da tela no Bundle
outState.PutString("MeuValor", meuValor);
}

Em seguida, basta chamar o metodo para restaurar esse estado

protected override void OnRestoreInstanceState(Bundle savedInstanceState)
{
base.OnRestoreInstanceState(savedInstanceState);
teste = savedInstanceState.GetString("MeuValor");
}

Solução 2

Se o Bundle está vindo zerado(null) então esta é a solução: Usaremos um artifício de persistência de dados temporárias no dispositivo para armazenar as informações que julgamos importantes.

Adicione o bloco de código abaixo:

protected override void OnSaveInstanceState(Bundle outState)
{
base.OnSaveInstanceState(outState);
// Salvar o valor de "MinhaVariavel" no SharedPreferences
GetPreferences(FileCreationMode.Private).Edit().PutString("TextoQualquer", MinhaVariavel).Apply();
}

Neste caso, não será necessário sobrescrever o método OnRestoreInstanceState, mas sim inserir um trecho dentro do OnCreate

MinhaVariavel= GetPreferences(FileCreationMode.Private).GetString("TextoQualquer", "");

Entendendo o que foi feito

O método GetPreferences o Android cria automaticamente um arquivo de preferências compartilhadas para você, associado à atividade atual, ou seja, ele persiste os dados temporariamente. Além disso, caso queira tornar essas informações visíveis a nivel global da aplicação, você pode utilizar o GetSharedPreferences.

Usando o GetSharedPreferences

A sintaxe muda um pouco, o sentido principal ainda é o mesmo.

protected override void OnSaveInstanceState(Bundle outState)
{
base.OnSaveInstanceState(outState);
// Salvar o valor de "MinhaVariavel" no SharedPreferences
ISharedPreferencesEditor editor = GetSharedPreferences("MeusEstados", FileCreationMode.Private).Edit();
editor.PutString("stringVariavel", MinhaVariavel);
editor.Apply();
}

Agora é só ir no onCreate!

MinhaVariavel = GetSharedPreferences("MeusEstados", FileCreationMode.Private).GetString("stringVariavel", "");

Caso queira saber mais sobre essas diferenças Clique aqui!

Até a próxima! :D

Top comments (0)