navigateUp com Bundle!

Mahdi Nouri Segue Mai 11 · 2 min ler

Já faz um tempo que o Google lançou o componente de navegação. É uma ótima biblioteca para lidar com navegação em um aplicativo Android. Mas você já tentou navegar de um fragmento para outro para obter um resultado disso? A maneira recomendada do Google para conseguir isso é usar o ViewModel compartilhado, o que significa que você precisa lidar com o padrão ViewModel apenas para compartilhar dados entre fragmentos e, além disso, na minha opinião, essa não é uma solução ideal apenas para compartilhar dados entre dois Fragmentos estão usando o padrão de atividade única, porque seus ViewModels permanecerão na memória por quase todo o ciclo de vida do aplicativo.

Uma solução melhor

Eu pensei comigo mesmo porque não lidar com isso da mesma maneira que o startActivityForResult funciona. Quero dizer, você só precisa substituir a função onActivityResult e, em vez de iniciar sua Activity com a função startActivity , você usaria startActivityForResult e passaria um código de solicitação como segundo parâmetro e é isso (pelo menos para o ponto inicial Activity).

Ok boa ideia, mas como?

Eu trabalhei em uma biblioteca de código aberto para resolver esse problema. Eu tentei fazer este processo tão fácil quanto startActivityForResult mas para Fragmentos.

Como usar

Primeiro de tudo, precisamos adicionar a dependência do NavigationResult em nosso arquivo build.gradle :

 dependência { 
implementação "com.phelat: navigationresult: 1.0.0-alpha3"}

Precisamos estender nosso fragmento de ponto de partida a partir do BundleFragment:

Ao fazer isso, podemos acessar a função de navigate do BundleFragment, que recebe um segundo argumento como código de solicitação:

E para receber o resultado do FragmentB, temos que substituir o onFragmentResult no FragmentA:

Agora podemos usar a função navigateUp , que é uma função de extensão em Fragment e recebe um Bundle como segundo argumento em nosso fragmento de destino para passar dados de FragmentB para FragmentA:

Ok, então agora estamos quase terminando, mas há mais um passo a ser dado, temos que estender nossa atividade de FragmentResultActivity .

Usamos FragmentResultActivity para armazenar todas as solicitações pendentes. Você também pode navegar com o código de solicitação usando FragmentResultActivities, da mesma forma que faria com BundleFragments.

Benefícios

  • É 100% escrito em Kotlin
  • Nenhum modelo de visualização compartilhada resulta em menos clichê