Jonny Borges

fix controller remain when navigate to same route

1 import 'package:flutter/material.dart'; 1 import 'package:flutter/material.dart';
2 import 'package:get/get.dart'; 2 import 'package:get/get.dart';
3 -  
4 -import 'app/routes/app_pages.dart';  
5 -import 'services/auth_service.dart'; 3 +import 'dart:math';
6 4
7 void main() { 5 void main() {
8 - runApp(  
9 - GetMaterialApp.router(  
10 - title: "Application",  
11 - initialBinding: BindingsBuilder(  
12 - () {  
13 - Get.put(AuthService());  
14 - }, 6 + runApp(GetMaterialApp(
  7 + initialRoute: '/splash',
  8 + getPages: [
  9 + GetPage(
  10 + name: '/splash',
  11 + page: () => SplashPage(),
  12 + binding: SplashBinding(),
  13 + ),
  14 + GetPage(
  15 + name: '/login',
  16 + page: () => LoginPage(),
  17 + binding: LoginBinding(),
  18 + ),
  19 + ],
  20 + ));
  21 +}
  22 +
  23 +class SplashPage extends GetView<SplashController> {
  24 + @override
  25 + Widget build(BuildContext context) {
  26 + return Scaffold(
  27 + appBar: AppBar(title: Text('Splash')),
  28 + body: Center(
  29 + child: RaisedButton(
  30 + onPressed: () => Get.offNamed('/login'),
  31 + child: Obx(() => Text(
  32 + 'Login ${controller.service.title} >>> ${controller.service.counter}')),
  33 + ),
  34 + ),
  35 + floatingActionButton: FloatingActionButton(
  36 + onPressed: controller.service.increment,
  37 + child: Icon(Icons.add),
  38 + ),
  39 + );
  40 + }
  41 +}
  42 +
  43 +class SplashBinding extends Bindings {
  44 + @override
  45 + void dependencies() {
  46 + Get.lazyPut(() => ServiceController()); // or lazyPut
  47 + Get.lazyPut(() => SplashController(service: Get.find()));
  48 + }
  49 +}
  50 +
  51 +class SplashController extends GetxController {
  52 + // final service = Get.find<ServiceController>();
  53 + final ServiceController service;
  54 + SplashController({
  55 + required this.service,
  56 + });
  57 +}
  58 +
  59 +class LoginBinding extends Bindings {
  60 + @override
  61 + void dependencies() {
  62 + Get.lazyPut(() => ServiceController()); // or lazyPut
  63 + Get.lazyPut(() => LoginController(service: Get.find()));
  64 + }
  65 +}
  66 +
  67 +class LoginController extends GetxController {
  68 + // final service = Get.find<ServiceController>();
  69 + final ServiceController service;
  70 + LoginController({
  71 + required this.service,
  72 + });
  73 +}
  74 +
  75 +class LoginPage extends GetView<LoginController> {
  76 + @override
  77 + Widget build(BuildContext context) {
  78 + return Scaffold(
  79 + appBar: AppBar(title: Text('Login')),
  80 + body: Center(
  81 + child: Obx(() => Text(
  82 + 'Login ${controller.service.title} >>> ${controller.service.counter}')),
15 ), 83 ),
16 - getPages: AppPages.routes,  
17 - // routeInformationParser: GetInformationParser(  
18 - // // initialRoute: Routes.HOME,  
19 - // ),  
20 - // routerDelegate: GetDelegate(  
21 - // backButtonPopMode: PopMode.History,  
22 - // preventDuplicateHandlingMode:  
23 - // PreventDuplicateHandlingMode.ReorderRoutes,  
24 - // ), 84 + floatingActionButton: FloatingActionButton(
  85 + onPressed: controller.service.increment,
  86 + child: Icon(Icons.add),
25 ), 87 ),
26 ); 88 );
  89 + }
  90 +}
  91 +
  92 +class ServiceController extends GetxController {
  93 + final title = Random().nextInt(99999).toString();
  94 + final counter = 0.obs;
  95 +
  96 + increment() => counter.value++;
  97 +
  98 + @override
  99 + void onInit() {
  100 + print('onInit $counter');
  101 + super.onInit();
  102 + }
  103 +
  104 + @override
  105 + void onClose() {
  106 + print('onClose $counter');
  107 + super.onClose();
  108 + }
27 } 109 }
@@ -214,11 +214,37 @@ class GetInstance { @@ -214,11 +214,37 @@ class GetInstance {
214 214
215 for (final element in keysToRemove) { 215 for (final element in keysToRemove) {
216 delete(key: element); 216 delete(key: element);
  217 + _routesKey.remove(element);
  218 + }
  219 +
  220 + keysToRemove.clear();
  221 + }
  222 +
  223 + void reloadDependencyByRoute(String routeName) {
  224 + final keysToRemove = <String>[];
  225 + _routesKey.forEach((key, value) {
  226 + if (value == routeName) {
  227 + keysToRemove.add(key);
  228 + }
  229 + });
  230 +
  231 + /// Removes [Get.create()] instances registered in [routeName].
  232 + if (_routesByCreate.containsKey(routeName)) {
  233 + for (final onClose in _routesByCreate[routeName]!) {
  234 + // assure the [DisposableInterface] instance holding a reference
  235 + // to [onClose()] wasn't disposed.
  236 + onClose();
  237 + }
  238 + _routesByCreate[routeName]!.clear();
  239 + _routesByCreate.remove(routeName);
217 } 240 }
218 241
219 for (final element in keysToRemove) { 242 for (final element in keysToRemove) {
220 - _routesKey.remove(element); 243 + print('reload $element');
  244 + reload(key: element);
  245 + //_routesKey.remove(element);
221 } 246 }
  247 +
222 keysToRemove.clear(); 248 keysToRemove.clear();
223 } 249 }
224 250
1 import 'package:flutter/widgets.dart'; 1 import 'package:flutter/widgets.dart';
  2 +import 'package:get/instance_manager.dart';
2 import '../../../../get_core/get_core.dart'; 3 import '../../../../get_core/get_core.dart';
3 import '../../../get_navigation.dart'; 4 import '../../../get_navigation.dart';
4 import '../../dialog/dialog_route.dart'; 5 import '../../dialog/dialog_route.dart';
@@ -193,6 +194,10 @@ class GetObserver extends NavigatorObserver { @@ -193,6 +194,10 @@ class GetObserver extends NavigatorObserver {
193 currentRoute.isBottomSheet ? false : value.isBottomSheet; 194 currentRoute.isBottomSheet ? false : value.isBottomSheet;
194 value.isDialog = currentRoute.isDialog ? false : value.isDialog; 195 value.isDialog = currentRoute.isDialog ? false : value.isDialog;
195 }); 196 });
  197 + if (oldRoute is GetPageRoute) {
  198 + print(oldRoute.reference);
  199 + GetInstance().reloadDependencyByRoute(oldRoute.reference);
  200 + }
196 201
197 routing?.call(_routeSend); 202 routing?.call(_routeSend);
198 } 203 }
@@ -216,6 +221,10 @@ class GetObserver extends NavigatorObserver { @@ -216,6 +221,10 @@ class GetObserver extends NavigatorObserver {
216 value.isDialog = currentRoute.isDialog ? false : value.isDialog; 221 value.isDialog = currentRoute.isDialog ? false : value.isDialog;
217 }); 222 });
218 223
  224 + if (route is GetPageRoute) {
  225 + print(route.reference);
  226 + GetInstance().reloadDependencyByRoute(route.reference);
  227 + }
219 routing?.call(_routeSend); 228 routing?.call(_routeSend);
220 } 229 }
221 } 230 }