Jonny Borges

fix navigate to same route

... ... @@ -161,18 +161,31 @@ class GetInstance {
bool fenix = false,
}) {
final key = _getKey(S, name);
_singl.putIfAbsent(
key,
() => _InstanceBuilderFactory<S>(
if (_singl.containsKey(key)) {
final dep = _singl[key];
if (dep != null && dep.isDirty) {
_singl[key] = _InstanceBuilderFactory<S>(
isSingleton,
builder,
permanent,
false,
fenix,
name,
),
lateRemove: dep as _InstanceBuilderFactory<S>,
);
}
} else {
_singl[key] = _InstanceBuilderFactory<S>(
isSingleton,
builder,
permanent,
false,
fenix,
name,
);
}
}
/// Initializes the dependencies for a Class Instance [S] (or tag),
/// If its a Controller, it starts the lifecycle process.
... ... @@ -222,6 +235,16 @@ class GetInstance {
}
}
void markAsDirty<S>({String? tag, String? key}) {
final newKey = key ?? _getKey(S, tag);
if (_singl.containsKey(newKey)) {
final dep = _singl[newKey];
if (dep != null) {
dep.isDirty = true;
}
}
}
/// Initializes the controller
S _startController<S>({String? tag}) {
final key = _getKey(S, tag);
... ... @@ -258,7 +281,8 @@ class GetInstance {
S find<S>({String? tag}) {
final key = _getKey(S, tag);
if (isRegistered<S>(tag: tag)) {
if (_singl[key] == null) {
final dep = _singl[key];
if (dep == null) {
if (tag == null) {
throw 'Class "$S" is not registered';
} else {
... ... @@ -266,11 +290,16 @@ class GetInstance {
}
}
// if (dep.lateRemove != null) {
// dep.isDirty = true;
// if(dep.fenix)
// }
/// although dirty solution, the lifecycle starts inside
/// `initDependencies`, so we have to return the instance from there
/// to make it compatible with `Get.create()`.
final i = _initDependencies<S>(name: tag);
return i ?? _singl[key]!.getDependency() as S;
return i ?? dep.getDependency() as S;
} else {
// ignore: lines_longer_than_80_chars
throw '"$S" not found. You need to call "Get.put($S())" or "Get.lazyPut(()=>$S())"';
... ... @@ -324,7 +353,16 @@ class GetInstance {
return false;
}
final builder = _singl[newKey]!;
final dep = _singl[newKey];
if (dep == null) return false;
final _InstanceBuilderFactory builder;
if (dep.isDirty) {
builder = dep.lateRemove ?? dep;
} else {
builder = dep;
}
if (builder.permanent && !force) {
Get.log(
... ... @@ -346,8 +384,15 @@ class GetInstance {
}
if (builder.fenix) {
//TODO: Remove if is late remove
builder.dependency = null;
builder.isInit = false;
return true;
} else {
if (dep.lateRemove != null) {
dep.lateRemove = null;
Get.log('"$newKey" deleted from memory');
return false;
} else {
_singl.remove(newKey);
if (_singl.containsKey(newKey)) {
... ... @@ -355,10 +400,10 @@ class GetInstance {
} else {
Get.log('"$newKey" deleted from memory');
}
}
return true;
}
}
}
/// Delete all registered Class Instances and, closes any open
/// controllers `DisposableInterface`, cleans up the memory
... ... @@ -382,11 +427,11 @@ class GetInstance {
});
}
void reload<S>(
{String? tag,
void reload<S>({
String? tag,
String? key,
bool force = false,
bool closeInstance = true}) {
}) {
final newKey = key ?? _getKey(S, tag);
final builder = _getDependency<S>(tag: tag, key: newKey);
... ... @@ -406,7 +451,7 @@ class GetInstance {
return;
}
if (i is GetLifeCycleBase && closeInstance) {
if (i is GetLifeCycleBase) {
i.onDelete();
Get.log('"$newKey" onDelete() called');
}
... ... @@ -467,6 +512,10 @@ class _InstanceBuilderFactory<S> {
bool isInit = false;
_InstanceBuilderFactory<S>? lateRemove;
bool isDirty = false;
String? tag;
_InstanceBuilderFactory(
... ... @@ -475,8 +524,9 @@ class _InstanceBuilderFactory<S> {
this.permanent,
this.isInit,
this.fenix,
this.tag,
);
this.tag, {
this.lateRemove,
});
void _showInitLog() {
if (tag == null) {
... ...
... ... @@ -319,7 +319,7 @@ class GetDelegate extends RouterDelegate<GetNavConfig>
return route;
}
Future<void> toNamed(
Future<T> toNamed<T>(
String page, {
dynamic arguments,
Map<String, String>? parameters,
... ... @@ -332,13 +332,19 @@ class GetDelegate extends RouterDelegate<GetNavConfig>
final decoder = Get.routeTree.matchRoute(page, arguments: arguments);
decoder.replaceArguments(arguments);
await pushHistory(
final completer = Completer<T>();
_allCompleters[decoder.route!] = completer;
pushHistory(
GetNavConfig(
currentTreeBranch: decoder.treeBranch,
location: page,
state: null, //TODO: persist state?
),
);
return completer.future;
}
Future<void> offNamed(
... ... @@ -400,6 +406,8 @@ class GetDelegate extends RouterDelegate<GetNavConfig>
return false;
}
final _allCompleters = <GetPage, Completer>{};
bool _onPopVisualRoute(Route<dynamic> route, dynamic result) {
final didPop = route.didPop(result);
if (!didPop) {
... ...
... ... @@ -7,7 +7,7 @@ import '../../get.dart';
class RouterReportManager<T> {
/// Holds a reference to `Get.reference` when the Instance was
/// created to manage the memory.
static final Map<String, Route?> _routesKey = {};
static final Map<Route?, String> _routesKey = {};
/// Stores the onClose() references of instances created with `Get.create()`
/// using the `Get.reference`.
... ... @@ -29,7 +29,7 @@ class RouterReportManager<T> {
/// Links a Class instance [S] (or [tag]) to the current route.
/// Requires usage of `GetMaterialApp`.
static void reportDependencyLinkedToRoute(String depedencyKey) {
_routesKey.putIfAbsent(depedencyKey, () => _current);
_routesKey[_current] = depedencyKey;
}
static void clearRouteKeys() {
... ... @@ -47,9 +47,9 @@ class RouterReportManager<T> {
if (Get.smartManagement != SmartManagement.onlyBuilder) {
WidgetsBinding.instance!.addPostFrameCallback((_) {
///TODO: Is necessary this comparator?
if (_current != disposed) {
//if (_current != disposed) {
_removeDependencyByRoute(disposed);
}
// }
});
}
}
... ... @@ -57,8 +57,8 @@ class RouterReportManager<T> {
static void reportRouteWillDispose(Route disposed) {
final keysToRemove = <String>[];
_routesKey.forEach((key, value) {
if (value == disposed) {
keysToRemove.add(key);
if (key == disposed) {
keysToRemove.add(value);
}
});
... ... @@ -74,7 +74,8 @@ class RouterReportManager<T> {
}
for (final element in keysToRemove) {
GetInstance().reload(key: element, closeInstance: false);
GetInstance().markAsDirty(key: element);
//_routesKey.remove(element);
}
... ... @@ -88,8 +89,8 @@ class RouterReportManager<T> {
static void _removeDependencyByRoute(Route routeName) {
final keysToRemove = <String>[];
_routesKey.forEach((key, value) {
if (value == routeName) {
keysToRemove.add(key);
if (key == routeName) {
keysToRemove.add(value);
}
});
... ... @@ -105,9 +106,11 @@ class RouterReportManager<T> {
}
for (final element in keysToRemove) {
GetInstance().delete(key: element);
final value = GetInstance().delete(key: element);
if (value) {
_routesKey.remove(element);
}
}
keysToRemove.clear();
}
... ...
... ... @@ -36,9 +36,11 @@ class GetPageRoute<T> extends PageRoute<T> with GetPageRouteTransitionMixin<T> {
bool fullscreenDialog = false,
this.middlewares,
}) : super(settings: settings, fullscreenDialog: fullscreenDialog) {
RouterReportManager.reportCurrentRoute(this);
_bla = this;
}
late Route _bla;
@override
final Duration transitionDuration;
final GetPageBuilder? page;
... ... @@ -73,8 +75,17 @@ class GetPageRoute<T> extends PageRoute<T> with GetPageRouteTransitionMixin<T> {
final bool maintainState;
@override
void install() {
super.install();
RouterReportManager.reportCurrentRoute(this);
}
@override
void dispose() {
super.dispose();
if (_bla != this) {
throw 'DJHOSIDS';
}
RouterReportManager.reportRouteDispose(this);
// if (Get.smartManagement != SmartManagement.onlyBuilder) {
... ... @@ -85,12 +96,17 @@ class GetPageRoute<T> extends PageRoute<T> with GetPageRouteTransitionMixin<T> {
middlewareRunner.runOnPageDispose();
}
@override
Widget buildContent(BuildContext context) {
Widget? _child;
Widget _getChild() {
if (_child != null) return _child!;
final middlewareRunner = MiddlewareRunner(middlewares);
final bindingsToBind = middlewareRunner.runOnBindingsStart(bindings);
binding?.dependencies();
final localbindings = [
if (bindings != null) ...bindings!,
if (binding != null) ...[binding!]
];
final bindingsToBind = middlewareRunner.runOnBindingsStart(localbindings);
if (bindingsToBind != null) {
for (final binding in bindingsToBind) {
binding.dependencies();
... ... @@ -98,7 +114,13 @@ class GetPageRoute<T> extends PageRoute<T> with GetPageRouteTransitionMixin<T> {
}
final pageToBuild = middlewareRunner.runOnPageBuildStart(page)!;
return middlewareRunner.runOnPageBuilt(pageToBuild());
_child = middlewareRunner.runOnPageBuilt(pageToBuild());
return _child!;
}
@override
Widget buildContent(BuildContext context) {
return _getChild();
}
@override
... ...
import 'dart:async';
import 'package:flutter/cupertino.dart';
import 'package:flutter/foundation.dart';
import 'package:flutter/material.dart';
... ... @@ -89,6 +91,8 @@ class GetPage<T> extends Page<T> {
this.showCupertinoParallax = true,
this.preventDuplicates = true,
}) : path = _nameToRegex(name),
assert(name.startsWith('/'),
'It is necessary to start route name [$name] with a slash: /$name'),
super(
key: ValueKey(name),
name: name,
... ... @@ -175,10 +179,11 @@ class GetPage<T> extends Page<T> {
@override
Route<T> createRoute(BuildContext context) {
// return GetPageRoute<T>(settings: this, page: page);
return PageRedirect(
final _page = PageRedirect(
route: this,
settings: this,
unknownRoute: unknownRoute,
).getPageToRoute<T>(this, unknownRoute);
return _page;
}
}
... ...
... ... @@ -181,8 +181,8 @@ class GetObserver extends NavigatorObserver {
Get.log("REPLACE ROUTE $oldName");
Get.log("NEW ROUTE $newName");
if (oldRoute != null) {
RouterReportManager.reportCurrentRoute(oldRoute);
if (newRoute != null) {
RouterReportManager.reportCurrentRoute(newRoute);
}
_routeSend?.update((value) {
... ...