Flutterando / modular

A smart project structure
https://pub.dev/packages/flutter_modular
Other
1.31k stars 254 forks source link

Dispose not being called on module after navigating to another one #66

Closed Gustav0ar closed 4 years ago

Gustav0ar commented 4 years ago

Like I talked to @jacobaraujo7 ,

The scenario is like this:

  1. App starts in HomeModule ("/")
  2. Navigate to NewPage in NewModule ("/new") with Modular.to.pushNamed('/new')
  3. Navigate to Page2 in NewModule ("/new/page2") with Modular.to.pushNamed('/new/page2')
  4. Navigate back to HomeModule ("/") with Modular.to.pushReplacementNamed('/')

When executing step 4, it should dispose NewModule, but it never happens. That can cause issues when navigating back to NewModule. It only disposes correctly if I navigate to "/" inside the "/new" route (first route inside NewModule), if I try to navigate from 2+ page in stack, it doesn't dispose. You can test this scenario uncometing the line 24 inside new_page.dart

Minimal reproducible project: https://github.com/Gustav0ar/modular_route_bug

Gustav0ar commented 4 years ago

Just to add, your suggestion to use popUntil works.

Eg: Modular.to.popUntil(ModalRoute.withName("/"));

Gustav0ar commented 4 years ago

@jacobaraujo7 For what reason did you close the issue? I didn't see any commit / PR about fixing this issue. popUntil does not solve all the cases, because it needs to a route that is in the stack for it to work. In case I want to navigate to another different route, it won't solve the issue.

Por qual motivo fechou o problema? Eu não vi nenhum commit / PR sobre a correção deste problema. popUntil não resolve para todas as situações, pq o problema vai persistir caso queria navegar para uma rota que não está na pilha de navegação.

jacobaraujo7 commented 4 years ago

Eu ia falar no privado. Mas n tem problema a ser corrigido. Quando vc faz o pusReplacement ele apenas sobreescreve a rota anterior, ou seja, a rota A push B pushReplacement para a C, a arvore vai ficar. A e C

Vc pode usar outras ferramentas como ReplacementAndPopUntil, ou qualquer outra ferramenta que tenha Until.

Desculpe se fechei abruptamente, problemas com o LATAM Roadshow e n conseguir chamar no PV.

jacobaraujo7 commented 4 years ago

Outra coisa q o PushReplacement nao seve para voltar, ele cria uma nova tela e sobrescreve a anterior:

https://www.youtube.com/watch?v=jMMzbrHN9Ak

Gustav0ar commented 4 years ago

Ah blz, mas o modular não deveria ser "inteligente" para quando navega para uma rota fora do módulo ele automaticamente dar dispose para evitar memory leak e outros problemas?

jacobaraujo7 commented 4 years ago

Mas vc ainda está dentro do módulo, a rota new ainda existe

Gustav0ar commented 4 years ago

Estou falando quando navega para outro módulo com o pushReplacement, que na prática não teria como voltar para o módulo que você estava. Ou seja, teria que dar dispose para não ter problemas...

Gustav0ar commented 4 years ago

Exemplo do que eu estou falando: Estou inicio no módulo A que tem rota "/" Depois vou para o módulo B na rota "/moduloB" Depois quero navegar para o módulo C na rota "/moduloC" sem poder voltar para o módulo B. Como faço isso dando dispose no Módulo B?

jacobaraujo7 commented 4 years ago

Ai vc faz o replacement normalmente. Nesse caso vai funcioonar. No seu exemplo vc tinha uma rota a mais, ai faz o replacement, entao o modulo ainda existe. Veja o vídeo sobre navegação, existe varias funcionalidades no navigation pra isso. Mas realmente a gente trabalha respeitando o sistema de rotas do flutter.

Gustav0ar commented 4 years ago

@jacobaraujo7 vou fechar este issue. Realmente eu estava equivocado. Não é o Modular que deve se preocupar em chamar o dispose, o próprio Flutter já faz isso automaticamente quando se usa corretamente. Eu não tinha entendido direito o esquema de rotas e fiz uma confusão aqui. Para mim o pushReplacement limpava toda as rotas passadas, mas não, ele limpa só a última. O correto seria usar pushNamedAndRemoveUntil ou popUntil/pop. Eu corrigi aqui https://github.com/Gustav0ar/modular_route_bug e agora está funcionando corretamente.

Muito obrigado pelos esclarecimentos.

muzzah commented 3 years ago

Can I ask if this was resolved? Im having a very similar issue where I use pushReplacementNamed and events are still being fired on the widget that should have been disposed. I dont speak portugese so its difficult to follow the conversation.

Bwolfs2 commented 3 years ago

I guess this was solved, u can provide a sample app simulating this problem?

andregusmao commented 3 years ago

Estou tendo um problema parecido:

  1. Chamo o módulo A: INITIALIZED
  2. Saio do módulo A: DISPOSED

Porém se eu fizer o seguinte:

  1. Chamo o módulo A: INITIALIZED
  2. Navego por outras telas do mesmo módulo e volto pra janela principal do módulo
  3. Saio do módulo: não dá disposable nunca mais