Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Tem horas que mesmo saindo de um módulo, ele não tá executando dispose. #11

Closed
wemersonrv opened this issue Dec 17, 2019 · 14 comments
Closed

Comments

@wemersonrv
Copy link
Contributor

wemersonrv commented Dec 17, 2019

Boa tarde, tem horas que mesmo saindo de um módulo, ele não tá executando dispose. Veja um exemplo de uma rota:

AppModule

List<Router> get routers => [
        ...
        Router('/profile', module: ProfileModule()),
      ];

ProfileModule

@override
  List<Router> get routers => [
        Router('/', child: (_, args) => ProfilePage()),
        Router('/edit', child: (_, args) => ProfileEditPage()),
        Router('/about', child: (_, args) => ProfileAboutPage()),
      ];

No meu app, primeiro entra no ProfilePage pra exibir os dados, e exibe uma opção para exibir detalhes (/profile/about) ou editar o perfil(/profile/edit)... E pelo botão voltar que é colocado na AppBar, vai seguindo a stack das rotas até retornar pra tela anterior à carga do /profile aqui o comportamento tá certinho... mas se tento navegar pra fora, com um pushReplacementNamed, popAndPushNamed etc, navega pro novo destino fora da rota /profile mas não dá dispose no módulo.

Nesse caso eu devo forçar o dispose de alguma forma antes de navegar pra fora da rota ?

@wemersonrv
Copy link
Contributor Author

Confirmado, verifiquei aqui em outra tela, que ao navegar para outra rota, não fez dispose do módulo

@jacobaraujo7
Copy link
Contributor

Qual versão está utilizando?

@wemersonrv
Copy link
Contributor Author

Qual versão está utilizando?

flutter_modular: ^0.1.0+1

@jacobaraujo7
Copy link
Contributor

fix version 0.1.2

@jacobaraujo7
Copy link
Contributor

Alguma coisas precisam ser esclarecidas sobre o popAndPushNamed.
Como o próprio nome diz, ele sai de uma rota e entra em outra, e nem replacement faz na rota anterior, ou seja, a pagina ainda está funcionando por trás dos panos, e como ela existe, o dispose nao é executado.
Até por uma questão de peformance, é melhor usar o pushNamedAndRemoveUntil, que possibilita ter um controle sobre as rotas que serão removidas.

Navigator.pushNamedAndRemoveUntil(context, '/home', ModalRoute.withName('/home'));

Aqui nesse caso especifico, ele vai enviar a rota /home com o push, e vai removendo todas as rotas que estejam acima do /home, definimos isso com o preficado ModalRoute.withName('/home')

Essa é uma boa estratégia para sair de uma rota dupla e o Modular entender e remover da memória o módulo com o dispose.

@wemersonrv
Copy link
Contributor Author

wemersonrv commented Dec 18, 2019

Alguma coisas precisam ser esclarecidas sobre o popAndPushNamed.
Como o próprio nome diz, ele sai de uma rota e entra em outra, e nem replacement faz na rota anterior, ou seja, a pagina ainda está funcionando por trás dos panos, e como ela existe, o dispose nao é executado.
Até por uma questão de peformance, é melhor usar o pushNamedAndRemoveUntil, que possibilita ter um controle sobre as rotas que serão removidas.

Navigator.pushNamedAndRemoveUntil(context, '/home', ModalRoute.withName('/home'));

Aqui nesse caso especifico, ele vai enviar a rota /home com o push, e vai removendo todas as rotas que estejam acima do /home, definimos isso com o preficado ModalRoute.withName('/home')

Essa é uma boa estratégia para sair de uma rota dupla e o Modular entender e remover da memória o módulo com o dispose.

Bom dia @jacobaraujo7, atualizeo a versão aqui e testei com o pushNamedAndRemoveUntil e o dispose aconteceu. Valeu!

Ah detalhe, com o pushReplacementNamed não teria que fazer o dispose também visto que toda a stack de histórico das rotas vai ser substituída por uma nova com o replacement?

@jacobaraujo7
Copy link
Contributor

Nos meus testes aqui ele aconteceu com o pushReplacement

@wemersonrv
Copy link
Contributor Author

wemersonrv commented Dec 18, 2019

Nos meus testes aqui ele aconteceu com o pushReplacement

Rodei um flutter clean aqui e tentei de novo mas não deu com o pushReplacementNamed... Já com o pushNamedAndRemoveUntil funcionou conforme vc falou!

@johnymbr
Copy link

Bom dia @jacobaraujo7 , estou usando a versão 0.1.3, e o meu cenário é parecido:

AppModule

@override
  List<Router> get routers => [
        Router('/', module: HomeModule()),
        Router('/login', module: LoginModule()),
      ];

Quando entro na minha HomePage, uso meu HomeBloc pra verificar se o usuário está logado, se não estiver faço isso:

checkToken(BuildContext context) async {
    final prefs = await SharedPreferences.getInstance();
    final token = prefs.getString('TOKEN');

    // remover
    await Future.delayed(Duration(seconds: 10));

    if (token == null) {
      Navigator.pushReplacementNamed(context, '/login');
      return;
    } else {
      // check token on api
      onLoggedChanged(true);
    }
  }

Mas não acontece o HomeModule DISPOSED. Nesse caso não deveria acontecer? Até faz o dispose da minha HomePage, mas o módulo não.

@wemersonrv
Copy link
Contributor Author

Bom dia @jacobaraujo7 , estou usando a versão 0.1.3, e o meu cenário é parecido:

AppModule

@override
  List<Router> get routers => [
        Router('/', module: HomeModule()),
        Router('/login', module: LoginModule()),
      ];

Quando entro na minha HomePage, uso meu HomeBloc pra verificar se o usuário está logado, se não estiver faço isso:

checkToken(BuildContext context) async {
    final prefs = await SharedPreferences.getInstance();
    final token = prefs.getString('TOKEN');

    // remover
    await Future.delayed(Duration(seconds: 10));

    if (token == null) {
      Navigator.pushReplacementNamed(context, '/login');
      return;
    } else {
      // check token on api
      onLoggedChanged(true);
    }
  }

Mas não acontece o HomeModule DISPOSED. Nesse caso não deveria acontecer? Até faz o dispose da minha HomePage, mas o módulo não.

Seu caso é igual ao meu. Seu HomeModule aí tá na rota principal, daí não vai dar dispose mesmo. Eu penei aqui um tempão até entender. Teve que o @jacobaraujo7 interfeir aqui pra eu entender essa bagaça! hehehehe

@andregusmao
Copy link

andregusmao commented Apr 26, 2021

No meu caso acontece quase a mesma coisa:
A diferença é que se eu entro num módulo ele inicializa e se eu saio ele dá dispose.
Mas se eu navegar por qualquer rota dentro do módulo e depois sair ele não dá mais dispose e nem inicializa mais quando eu entro.
O código das minhas rotas está assim:
final List routes = [
ChildRoute('/', child: (, args) => ProductView()),
ChildRoute('/create', child: (
, args) => ProductCreateView()),
ChildRoute('/edit', child: (_, args) => AppNoImplementedView()),
];

E na ProductView está assim:
appBar: AppBar(
leading: IconButton(
icon: Icon(Icons.chevron_left),
onPressed: () => Modular.to.pop(context),
),
...

@JulioCGMC
Copy link

@andregusmao Meu caso é o mesmo, isso precisa ser remediado e essa issue reaberta.

@JulioCGMC
Copy link

@jacobaraujo7

@JulioCGMC
Copy link

JulioCGMC commented Jun 15, 2021

Ah @andregusmao enquanto isso não é visto, tem a opção de remover o modulo manualmente, vou mandar meu código de exemplo:
IconButton(
icon: Icon(Icons.arrow_back_ios),
onPressed: () {
Modular.to.pop();
Modular.removeModule(CompaniesModule());
}
),

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

5 participants