Como manter o estado de uma tela ao chamar deeplink no xamarin C#
Published: 2024-03-01 13:53:53

## 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](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/6lke1we6lir25hmzv4xv.png)

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!](https://stackoverflow.com/questions/33447290/whats-the-difference-between-getdefaultsharedpreferences-and-getpreferences)

Até a próxima! :D