-
Notifications
You must be signed in to change notification settings - Fork 256
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
Fix: Solves the problem of a module with children that does not dispose #911
Fix: Solves the problem of a module with children that does not dispose #911
Conversation
Código exemplo utilizado para teste com import 'package:flutter/material.dart';
import 'package:flutter_modular/flutter_modular.dart';
void main() {
runApp(ModularApp(module: AppModule(), child: const AppWidget()));
}
class AppWidget extends StatelessWidget {
const AppWidget({super.key});
@override
Widget build(BuildContext context) {
return MaterialApp.router(
routerConfig: Modular.routerConfig,
);
}
}
class AppModule extends Module {
@override
void routes(r) {
r.child('/', child: (_) => const LoginPage());
r.module('/main', module: MainModule());
r.module('/config', module: ConfigModule());
}
}
class LoginPage extends StatelessWidget {
const LoginPage({super.key});
@override
Widget build(BuildContext context) {
return Scaffold(
body: Center(
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: [
ElevatedButton(
onPressed: () => Modular.to.navigate('/main/'),
child: const Text('Login'),
),
ElevatedButton(
onPressed: () => Modular.to.pushNamed('/config/'),
child: const Text('Configuration'),
),
],
),
),
);
}
}
class MainModule extends Module {
@override
void routes(r) {
r.child(
'/',
child: (_) => const MainPage(),
children: [
ModuleRoute('/products', module: ProductModule()),
ModuleRoute('/customers', module: CustomerModule()),
],
);
}
}
class MainPage extends StatelessWidget {
const MainPage({super.key});
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(title: const Text('App')),
body: Column(
children: [
Row(
mainAxisAlignment: MainAxisAlignment.spaceEvenly,
children: [
ElevatedButton(
onPressed: () => Modular.to.navigate('/main/products/'),
child: const Text('Products'),
),
ElevatedButton(
onPressed: () => Modular.to.navigate('/main/customers/'),
child: const Text('Customers'),
),
ElevatedButton(
onPressed: () {
Modular.to.navigate('/');
},
child: const Text('Logout'),
),
],
),
const Expanded(child: RouterOutlet()),
],
),
);
}
}
class ProductModule extends Module {
@override
void routes(r) {
r.child('/', child: (_) => const ProductPage());
}
}
class ProductPage extends StatelessWidget {
const ProductPage({super.key});
@override
Widget build(BuildContext context) {
return const Scaffold(
body: Center(child: Text('Products List')),
);
}
}
class CustomerModule extends Module {
@override
void routes(r) {
r.child('/', child: (_) => const CustomerPage());
}
}
class CustomerPage extends StatelessWidget {
const CustomerPage({super.key});
@override
Widget build(BuildContext context) {
return const Scaffold(
body: Center(child: Text('Customers List')),
);
}
}
class ConfigModule extends Module {
@override
void routes(r) {
r.child('/', child: (_) => const ConfigPage());
r.module('/step1', module: Step1Module());
r.module('/step2', module: Step2Module());
}
}
class ConfigPage extends StatelessWidget {
const ConfigPage({super.key});
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(title: const Text('Config')),
body: Center(
child: ElevatedButton(
onPressed: () => Modular.to.pushNamed('/config/step1/'),
child: const Text('Go Step 1'),
),
),
);
}
}
class Step1Module extends Module {
@override
void routes(r) {
r.child('/', child: (_) => const Step1Page());
}
}
class Step1Page extends StatelessWidget {
const Step1Page({super.key});
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(title: const Text('Step1')),
body: Center(
child: ElevatedButton(
onPressed: () => Modular.to.pushNamed('/config/step2/'),
child: const Text('Go Step2'),
),
),
);
}
}
class Step2Module extends Module {
@override
void routes(r) {
r.child('/', child: (_) => const Step2Page());
}
}
class Step2Page extends StatelessWidget {
const Step2Page({super.key});
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(title: const Text('Step2')),
body: Center(
child: ElevatedButton(
onPressed: () => Modular.to.pushNamed('/config/step1/'),
child: const Text('Go Step1 again'),
),
),
);
}
} |
@eduardoflorence tudo bem? Como ficou essa questão? O módulo principal ainda permanece ativo após navegar para rotas filhas e sair. |
Na versão atual ainda permanece, pois esse PR ainda não foi aprovado |
Alguma sugestão paliativa, até esse PR ser aprovado? |
Bom dia, @migdev-br dependency_overrides:
modular_core:
git:
url: https://github.com/eduardoflorence/modular.git
ref: module_not_dispose
path: modular_core |
vou tentar rodar. |
@eduardoflorence o dispose até funciona, porém de alguma forma eu perco o estado do meu CoreModule. Quando o usuário faz login eu guardo algumas variáveis na store do core module, e quando navego por exemplo da home, para outra página/módulo, |
@migdev-br, você importa o seu CoreModule no AppModule também? O bind da sua store está como singleton para ele manter só uma instância para todo o App? |
sim, importei no AppModule e está como singleton. Fiz um exemplo aqui, da uma olha quando puder por favor, |
Desculpa a demora pessoal. |
Pessoal, alguma novidade? Conseguiram dar uma olhada no exemplo? |
@migdev-br, consegui analisar seu exemplo e vi onde estava o problema. Havia um diferença entre o modular_core que estava publicado com o do repositório, então meu repositório forcado provocava esse erro que citou. Já coloquei um novo PR para ser aprovado, mas se quiser testar, e só alterar aquele overrides que te passei para ficar com o novo branch: dependency_overrides:
modular_core:
git:
url: https://github.com/eduardoflorence/modular.git
ref: bug-create-exported-injector
path: modular_core |
Description
Ao navegar para uma rota filha, a rota mãe também é colocada na pilha e acrescentada para ser descartada (
List _disposeTags
). O problema acontece quando navegamos para uma segunda rota folha, pois era acrescentada novamente a rota mãe para descarte, causando duplicidade, então a rota mãe nunca era descartada devido a existência de mais de uma ocorrência para descarte.Checklist
fix:
,feat:
,docs:
etc).Breaking Change
Related Issues
#902
#899