diff --git a/CHANGELOG.md b/CHANGELOG.md index 9b93302..3aaf31c 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,7 @@ +## 4.11.0 + +- feat: add fromURL and prevURL for RouteSettings + ## 4.10.0 - feat: upgrade to flutter 3.19.x diff --git a/android/src/main/kotlin/com/foxsofter/flutter_thrio/navigator/NavigationController.kt b/android/src/main/kotlin/com/foxsofter/flutter_thrio/navigator/NavigationController.kt index 5dd5bf0..81abfb6 100644 --- a/android/src/main/kotlin/com/foxsofter/flutter_thrio/navigator/NavigationController.kt +++ b/android/src/main/kotlin/com/foxsofter/flutter_thrio/navigator/NavigationController.kt @@ -61,6 +61,8 @@ internal object NavigationController : Application.ActivityLifecycleCallbacks { route.settings.params, route.settings.animated, route.fromEntrypoint, + null, + null, route.fromPageId, ) { } } @@ -115,9 +117,11 @@ internal object NavigationController : Application.ActivityLifecycleCallbacks { params: T? = null, animated: Boolean, fromEntrypoint: String = NAVIGATION_NATIVE_ENTRYPOINT, + fromURL: String? = null, + prevURL: String? = null, fromPageId: Int = NAVIGATION_ROUTE_PAGE_ID_NONE, poppedResult: NullableAnyCallback? = null, - result: NullableIntCallback? + result: NullableIntCallback?, ) { if (routeType != RouteType.NONE) { result?.invoke(null) @@ -154,6 +158,8 @@ internal object NavigationController : Application.ActivityLifecycleCallbacks { // 序列化参数 val settings = RouteSettings(url, index).also { it.params = ModuleJsonSerializers.serializeParams(params) + it.fromURL = fromURL + it.prevURL = prevURL ?: ThrioNavigator.lastRoute()?.settings?.url it.animated = animated } val settingsData = hashMapOf().also { diff --git a/android/src/main/kotlin/com/foxsofter/flutter_thrio/navigator/PageObserverChannel.kt b/android/src/main/kotlin/com/foxsofter/flutter_thrio/navigator/PageObserverChannel.kt index 23d8747..360c3af 100644 --- a/android/src/main/kotlin/com/foxsofter/flutter_thrio/navigator/PageObserverChannel.kt +++ b/android/src/main/kotlin/com/foxsofter/flutter_thrio/navigator/PageObserverChannel.kt @@ -77,22 +77,22 @@ internal class PageObserverChannel constructor( } override fun willAppear(routeSettings: RouteSettings) { - val arguments = routeSettings.toArgumentsWithParams(null) + val arguments = routeSettings.toArgumentsWithoutParams() channel.invokeMethod("willAppear", arguments) } override fun didAppear(routeSettings: RouteSettings) { - val arguments = routeSettings.toArgumentsWithParams(null) + val arguments = routeSettings.toArgumentsWithoutParams() channel.invokeMethod("didAppear", arguments) } override fun willDisappear(routeSettings: RouteSettings) { - val arguments = routeSettings.toArgumentsWithParams(null) + val arguments = routeSettings.toArgumentsWithoutParams() channel.invokeMethod("willDisappear", arguments) } override fun didDisappear(routeSettings: RouteSettings) { - val arguments = routeSettings.toArgumentsWithParams(null) + val arguments = routeSettings.toArgumentsWithoutParams() channel.invokeMethod("didDisappear", arguments) } } \ No newline at end of file diff --git a/android/src/main/kotlin/com/foxsofter/flutter_thrio/navigator/RouteObserverChannel.kt b/android/src/main/kotlin/com/foxsofter/flutter_thrio/navigator/RouteObserverChannel.kt index ad90caf..c8bf668 100644 --- a/android/src/main/kotlin/com/foxsofter/flutter_thrio/navigator/RouteObserverChannel.kt +++ b/android/src/main/kotlin/com/foxsofter/flutter_thrio/navigator/RouteObserverChannel.kt @@ -51,22 +51,22 @@ internal class RouteObserverChannel constructor( } override fun didPush(routeSettings: RouteSettings) { - val arguments = routeSettings.toArgumentsWithParams(null) + val arguments = routeSettings.toArgumentsWithoutParams() channel.invokeMethod("didPush", arguments) } override fun didPop(routeSettings: RouteSettings) { - val arguments = routeSettings.toArgumentsWithParams(null) + val arguments = routeSettings.toArgumentsWithoutParams() channel.invokeMethod("didPop", arguments) } override fun didPopTo(routeSettings: RouteSettings) { - val arguments = routeSettings.toArgumentsWithParams(null) + val arguments = routeSettings.toArgumentsWithoutParams() channel.invokeMethod("didPopTo", arguments) } override fun didRemove(routeSettings: RouteSettings) { - val arguments = routeSettings.toArgumentsWithParams(null) + val arguments = routeSettings.toArgumentsWithoutParams() channel.invokeMethod("didRemove", arguments) } diff --git a/android/src/main/kotlin/com/foxsofter/flutter_thrio/navigator/RouteReceiveChannel.kt b/android/src/main/kotlin/com/foxsofter/flutter_thrio/navigator/RouteReceiveChannel.kt index 2dc8ea9..34ca483 100644 --- a/android/src/main/kotlin/com/foxsofter/flutter_thrio/navigator/RouteReceiveChannel.kt +++ b/android/src/main/kotlin/com/foxsofter/flutter_thrio/navigator/RouteReceiveChannel.kt @@ -66,11 +66,15 @@ internal class RouteReceiveChannel( val url = arguments["url"] as String val params = arguments["params"] val animated = arguments["animated"] == true + val fromURL = arguments["fromURL"] as String? + val prevURL = arguments["prevURL"] as String? NavigationController.Push.push( url, params, animated, - channel.entrypoint + channel.entrypoint, + fromURL, + prevURL, ) { result(it) } diff --git a/android/src/main/kotlin/com/foxsofter/flutter_thrio/navigator/RouteSettings.kt b/android/src/main/kotlin/com/foxsofter/flutter_thrio/navigator/RouteSettings.kt index dfb17d0..3fda9c7 100644 --- a/android/src/main/kotlin/com/foxsofter/flutter_thrio/navigator/RouteSettings.kt +++ b/android/src/main/kotlin/com/foxsofter/flutter_thrio/navigator/RouteSettings.kt @@ -28,33 +28,35 @@ import com.foxsofter.flutter_thrio.module.ModuleJsonDeserializers data class RouteSettings(val url: String, val index: Int) { var params: Any? = null + var fromURL: String? = null + var prevURL: String? = null var animated: Boolean = true var isNested: Boolean = false val name get() = "$index $url" - fun toArguments(): Map = mapOf( - "url" to url, - "index" to index, - "animated" to animated, - "isNested" to isNested, - "params" to params - ) - - fun toArgumentsWithParams(params: Any?): Map = when (params) { - null -> mapOf( + fun toArguments(): Map { + val args = mutableMapOf( "url" to url, "index" to index, "animated" to animated, - "isNested" to isNested + "isNested" to isNested, + "params" to params, ) - else -> mapOf( + if (fromURL?.isNotEmpty() == true) args["fromURL"] = fromURL + if (prevURL?.isNotEmpty() == true) args["prevURL"] = prevURL + return args.toMap() + } + + fun toArgumentsWithoutParams(): Map { + val args = mutableMapOf( "url" to url, "index" to index, "animated" to animated, - "isNested" to isNested, - "params" to params ) + if (fromURL?.isNotEmpty() == true) args["fromURL"] = fromURL + if (prevURL?.isNotEmpty() == true) args["prevURL"] = prevURL + return args.toMap() } fun toArgumentsWith(newUrl: String, newIndex: Int): Map = mapOf( @@ -65,7 +67,6 @@ data class RouteSettings(val url: String, val index: Int) { "newIndex" to newIndex, ) - override fun equals(other: Any?): Boolean { return other != null && other is RouteSettings && url == other.url && index == other.index } @@ -85,9 +86,13 @@ data class RouteSettings(val url: String, val index: Int) { val params = ModuleJsonDeserializers.deserializeParams(arguments["params"]) val animated = if (arguments["animated"] != null) arguments["animated"] as Boolean else false + val fromURL = arguments["fromURL"] as String? + val prevURL = arguments["prevURL"] as String? return RouteSettings(url, index).also { it.params = params it.animated = animated + if (fromURL != null) it.fromURL = fromURL + if (prevURL != null) it.prevURL = prevURL } } } diff --git a/android/src/main/kotlin/com/foxsofter/flutter_thrio/navigator/ThrioNavigator.kt b/android/src/main/kotlin/com/foxsofter/flutter_thrio/navigator/ThrioNavigator.kt index 6251f53..4a9d766 100644 --- a/android/src/main/kotlin/com/foxsofter/flutter_thrio/navigator/ThrioNavigator.kt +++ b/android/src/main/kotlin/com/foxsofter/flutter_thrio/navigator/ThrioNavigator.kt @@ -34,11 +34,15 @@ object ThrioNavigator { url: String, params: T? = null, animated: Boolean = true, + fromURL: String? = null, + prevURL: String? = null, poppedResult: NullableAnyCallback? = null, result: NullableIntCallback = {} ) = NavigationController.Push.push( url, params, animated, NAVIGATION_NATIVE_ENTRYPOINT, + fromURL, + prevURL, NAVIGATION_ROUTE_PAGE_ID_NONE, poppedResult, result @@ -48,11 +52,15 @@ object ThrioNavigator { fun push( url: String, animated: Boolean = true, + fromURL: String? = null, + prevURL: String? = null, poppedResult: NullableAnyCallback? = null, result: NullableIntCallback = {} ) = NavigationController.Push.push( url, null, animated, NAVIGATION_NATIVE_ENTRYPOINT, + fromURL, + prevURL, NAVIGATION_ROUTE_PAGE_ID_NONE, poppedResult, result diff --git a/example/ios/Runner.xcodeproj/project.pbxproj b/example/ios/Runner.xcodeproj/project.pbxproj index 2272b4f..2e049b1 100644 --- a/example/ios/Runner.xcodeproj/project.pbxproj +++ b/example/ios/Runner.xcodeproj/project.pbxproj @@ -426,7 +426,7 @@ CLANG_ENABLE_MODULES = YES; CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)"; DEFINES_MODULE = YES; - DEVELOPMENT_TEAM = 6J39XG5NG8; + DEVELOPMENT_TEAM = ""; ENABLE_BITCODE = NO; INFOPLIST_FILE = Runner/Info.plist; LD_RUNPATH_SEARCH_PATHS = ( @@ -556,7 +556,7 @@ CLANG_ENABLE_MODULES = YES; CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)"; DEFINES_MODULE = YES; - DEVELOPMENT_TEAM = 6J39XG5NG8; + DEVELOPMENT_TEAM = ""; ENABLE_BITCODE = NO; INFOPLIST_FILE = Runner/Info.plist; LD_RUNPATH_SEARCH_PATHS = ( @@ -579,7 +579,7 @@ CLANG_ENABLE_MODULES = YES; CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)"; DEFINES_MODULE = YES; - DEVELOPMENT_TEAM = 6J39XG5NG8; + DEVELOPMENT_TEAM = ""; ENABLE_BITCODE = NO; INFOPLIST_FILE = Runner/Info.plist; LD_RUNPATH_SEARCH_PATHS = ( diff --git a/example/lib/src/biz/biz2/flutter6/flutter6.route_custom_handler.dart b/example/lib/src/biz/biz2/flutter6/flutter6.route_custom_handler.dart index 4f86693..9caa48e 100644 --- a/example/lib/src/biz/biz2/flutter6/flutter6.route_custom_handler.dart +++ b/example/lib/src/biz/biz2/flutter6/flutter6.route_custom_handler.dart @@ -17,6 +17,7 @@ Future on$RouteCustomHandlerRegister( params, animated = true, result, + fromURL, }) => 'good' as TPopParams); registerFunc( @@ -27,12 +28,14 @@ Future on$RouteCustomHandlerRegister( params, animated = true, result, + fromURL, }) => ThrioNavigator.push( url: biz.biz1.flutter3.url, params: params, animated: animated, result: result, + fromURL: fromURL, )); registerFunc('justascheme://open/biz2/home', ( @@ -41,6 +44,7 @@ Future on$RouteCustomHandlerRegister( params, animated = true, result, + fromURL, }) { result?.call(-1); // 不拦截 return null; @@ -54,11 +58,13 @@ Future on$RouteCustomHandlerRegister( params, animated = true, result, + fromURL, }) => ThrioNavigator.push( url: biz.biz1.flutter3.url, params: params, animated: animated, result: result, + fromURL: fromURL, )); } diff --git a/ios/Classes/Navigator/NavigatorRouteReceiveChannel.m b/ios/Classes/Navigator/NavigatorRouteReceiveChannel.m index 3e042c6..14a14ab 100644 --- a/ios/Classes/Navigator/NavigatorRouteReceiveChannel.m +++ b/ios/Classes/Navigator/NavigatorRouteReceiveChannel.m @@ -102,6 +102,8 @@ - (void)_onPush { } id params = [arguments[@"params"] isKindOfClass:NSNull.class] ? nil : arguments[@"params"]; BOOL animated = [arguments[@"animated"] boolValue]; + NSString *fromURL = arguments[@"fromURL"]; + NSString *prevURL = arguments[@"prevURL"]; NavigatorVerbose(@"on push: %@", url); __strong typeof(weakself) strongSelf = weakself; [ThrioNavigator _pushUrl:url @@ -113,6 +115,8 @@ - (void)_onPush { result(idx); } } + fromURL:fromURL + prevURL:prevURL poppedResult:nil]; }]; } diff --git a/ios/Classes/Navigator/NavigatorRouteSettings.h b/ios/Classes/Navigator/NavigatorRouteSettings.h index ccf9787..dcc61f8 100644 --- a/ios/Classes/Navigator/NavigatorRouteSettings.h +++ b/ios/Classes/Navigator/NavigatorRouteSettings.h @@ -28,12 +28,16 @@ NS_ASSUME_NONNULL_BEGIN + (instancetype)settingsWithUrl:(NSString *)url index:(NSNumber *_Nullable)index nested:(BOOL)nested - params:(id _Nullable)params; + params:(id _Nullable)params + fromURL:(NSString *_Nullable)fromURL + prevURL:(NSString *_Nullable)prevURL; - (instancetype)initWithUrl:(NSString *)url index:(NSNumber *_Nullable)index nested:(BOOL)nested - params:(id _Nullable)params; + params:(id _Nullable)params + fromURL:(NSString *_Nullable)fromURL + prevURL:(NSString *_Nullable)prevURL; - (instancetype)init NS_UNAVAILABLE; @@ -55,6 +59,10 @@ NS_ASSUME_NONNULL_BEGIN @property (nonatomic, copy, readonly, nullable) id params; +@property (nonatomic, copy, readonly) NSString *fromURL; + +@property (nonatomic, copy, readonly) NSString *prevURL; + - (BOOL)isEqualToRouteSettings:(NavigatorRouteSettings *)other; @end diff --git a/ios/Classes/Navigator/NavigatorRouteSettings.m b/ios/Classes/Navigator/NavigatorRouteSettings.m index 1cf7a2c..05d1b12 100644 --- a/ios/Classes/Navigator/NavigatorRouteSettings.m +++ b/ios/Classes/Navigator/NavigatorRouteSettings.m @@ -25,14 +25,6 @@ @interface NavigatorRouteSettings () -@property (nonatomic, copy, readwrite) NSString *url; - -@property (nonatomic, strong, readwrite, nullable) NSNumber *index; - -@property (nonatomic, assign, readwrite) BOOL nested; - -@property (nonatomic, copy, readwrite, nullable) id params; - @end @implementation NavigatorRouteSettings @@ -40,14 +32,24 @@ @implementation NavigatorRouteSettings + (instancetype)settingsWithUrl:(NSString *)url index:(NSNumber *_Nullable)index nested:(BOOL)nested - params:(id _Nullable)params { - return [[self alloc] initWithUrl:url index:index nested:nested params:params]; + params:(id _Nullable)params + fromURL:(NSString *_Nullable)fromURL + prevURL:(NSString *_Nullable)prevURL{ + return [[self alloc] initWithUrl:url + index:index + nested:nested + params:params + fromURL:fromURL + prevURL:prevURL]; } - (instancetype)initWithUrl:(NSString *)url index:(NSNumber *_Nullable)index nested:(BOOL)nested - params:(id _Nullable)params { + params:(id _Nullable)params + fromURL:(NSString *_Nullable)fromURL + prevURL:(NSString *_Nullable)prevURL +{ NSAssert(url && url.length > 0, @"url must not be null or empty."); self = [super init]; @@ -56,6 +58,8 @@ - (instancetype)initWithUrl:(NSString *)url _index = index; _nested = nested; _params = params; + _fromURL = fromURL; + _prevURL = prevURL; } return self; } @@ -65,7 +69,14 @@ + (id _Nullable)settingsFromArguments:(NSDictionary *)arguments { NSNumber *index = [arguments[@"index"] isKindOfClass:NSNull.class] ? nil : arguments[@"index"]; id params = [arguments[@"params"] isKindOfClass:NSNull.class] ? nil : arguments[@"params"]; BOOL animated = [arguments[@"animated"] boolValue]; - return [self settingsWithUrl:url index:index nested:animated params:params]; + NSString *fromURL = arguments[@"fromURL"]; + NSString *prevURL = arguments[@"prevURL"]; + return [self settingsWithUrl:url + index:index + nested:animated + params:params + fromURL:fromURL + prevURL:prevURL]; } - (NSDictionary *)toArguments { @@ -73,7 +84,7 @@ - (NSDictionary *)toArguments { } - (NSDictionary *)toArgumentsWithParams:(id _Nullable)params { - return params ? @{ + NSMutableDictionary * args = params ? @{ @"url": _url, @"index": _index, @"isNested": @(_nested), @@ -82,20 +93,33 @@ - (NSDictionary *)toArgumentsWithParams:(id _Nullable)params { @"url": _url, @"index": _index, @"isNested": @(_nested), - }; + }.mutableCopy; + if (_fromURL) { + args[@"fromURL"] = _fromURL; + } + if (_prevURL) { + args[@"prevURL"] = _prevURL; + } + return args.copy; } - (NSDictionary *)toArgumentsWithNewUrl:(NSString *)newUrl newIndex:(NSNumber *)newIndex { - return @{ + NSMutableDictionary * args = @{ @"url": _url, @"index": _index, @"isNested": @(_nested), @"newUrl": newUrl, @"newIndex": newIndex, - }; + }.mutableCopy; + if (_fromURL) { + args[@"fromURL"] = _fromURL; + } + if (_prevURL) { + args[@"prevURL"] = _prevURL; + } + return args.copy; } - - (NSString *)name { return [NSString stringWithFormat:@"%@ %@", _index == nil ? @0 : _index, _url]; } diff --git a/ios/Classes/Navigator/ThrioNavigator+Internal.h b/ios/Classes/Navigator/ThrioNavigator+Internal.h index 2d168fa..3656fcc 100644 --- a/ios/Classes/Navigator/ThrioNavigator+Internal.h +++ b/ios/Classes/Navigator/ThrioNavigator+Internal.h @@ -37,6 +37,8 @@ NS_ASSUME_NONNULL_BEGIN animated:(BOOL)animated fromEntrypoint:fromEntrypoint result:(ThrioNumberCallback _Nullable)result + fromURL:(NSString *_Nullable)fromURL + prevURL:(NSString *_Nullable)prevURL poppedResult:(ThrioIdCallback _Nullable)poppedResult; + (void)_notifyUrl:(NSString *_Nullable)url diff --git a/ios/Classes/Navigator/ThrioNavigator+Internal.m b/ios/Classes/Navigator/ThrioNavigator+Internal.m index 51bdeb8..064d7a6 100644 --- a/ios/Classes/Navigator/ThrioNavigator+Internal.m +++ b/ios/Classes/Navigator/ThrioNavigator+Internal.m @@ -62,10 +62,15 @@ + (void)_pushUrl:(NSString *)url animated:(BOOL)animated fromEntrypoint:fromEntrypoint result:(ThrioNumberCallback _Nullable)result + fromURL:(NSString *_Nullable)fromURL + prevURL:(NSString *_Nullable)prevURL poppedResult:(ThrioIdCallback _Nullable)poppedResult { UINavigationController *nvc = self.navigationController; [self.navigationControllers addAndRemoveObject:nvc]; + if (!prevURL) { + prevURL = [ThrioNavigator lastRoute].settings.url; + } [nvc thrio_pushUrl:url params:params animated:animated @@ -74,7 +79,10 @@ + (void)_pushUrl:(NSString *)url if (result) { result(idx); } - } poppedResult:poppedResult]; + } + fromURL:fromURL + prevURL:prevURL + poppedResult:poppedResult]; } + (void)_notifyUrl:(NSString *_Nullable)url diff --git a/ios/Classes/Navigator/ThrioNavigator.m b/ios/Classes/Navigator/ThrioNavigator.m index 99fd1f3..95bba6d 100644 --- a/ios/Classes/Navigator/ThrioNavigator.m +++ b/ios/Classes/Navigator/ThrioNavigator.m @@ -44,6 +44,8 @@ + (void)pushUrl:(NSString *)url { animated:YES fromEntrypoint:nil result:nil + fromURL:nil + prevURL:nil poppedResult:nil]; } @@ -53,6 +55,8 @@ + (void)pushUrl:(NSString *)url result:(ThrioNumberCallback)result { animated:YES fromEntrypoint:nil result:result + fromURL:nil + prevURL:nil poppedResult:nil]; } @@ -62,6 +66,8 @@ + (void)pushUrl:(NSString *)url poppedResult:(ThrioIdCallback)poppedResult { animated:YES fromEntrypoint:nil result:nil + fromURL:nil + prevURL:nil poppedResult:poppedResult]; } @@ -71,6 +77,8 @@ + (void)pushUrl:(NSString *)url params:(id)params { animated:YES fromEntrypoint:nil result:nil + fromURL:nil + prevURL:nil poppedResult:nil]; } @@ -82,6 +90,8 @@ + (void)pushUrl:(NSString *)url animated:YES fromEntrypoint:nil result:result + fromURL:nil + prevURL:nil poppedResult:nil]; } @@ -93,6 +103,8 @@ + (void) pushUrl:(NSString *)url animated:YES fromEntrypoint:nil result:nil + fromURL:nil + prevURL:nil poppedResult:poppedResult]; } @@ -105,6 +117,8 @@ + (void) pushUrl:(NSString *)url animated:YES fromEntrypoint:nil result:result + fromURL:nil + prevURL:nil poppedResult:poppedResult]; } @@ -114,6 +128,8 @@ + (void)pushUrl:(NSString *)url animated:(BOOL)animated { animated:animated fromEntrypoint:nil result:nil + fromURL:nil + prevURL:nil poppedResult:nil]; } @@ -125,6 +141,8 @@ + (void)pushUrl:(NSString *)url animated:animated fromEntrypoint:nil result:result + fromURL:nil + prevURL:nil poppedResult:nil]; } @@ -136,6 +154,8 @@ + (void) pushUrl:(NSString *)url animated:animated fromEntrypoint:nil result:nil + fromURL:nil + prevURL:nil poppedResult:poppedResult]; } @@ -148,6 +168,8 @@ + (void) pushUrl:(NSString *)url animated:animated fromEntrypoint:nil result:result + fromURL:nil + prevURL:nil poppedResult:poppedResult]; } @@ -159,6 +181,8 @@ + (void)pushUrl:(NSString *)url animated:animated fromEntrypoint:nil result:nil + fromURL:nil + prevURL:nil poppedResult:nil]; } @@ -171,6 +195,8 @@ + (void)pushUrl:(NSString *)url animated:animated fromEntrypoint:nil result:result + fromURL:nil + prevURL:nil poppedResult:nil]; } @@ -183,6 +209,8 @@ + (void) pushUrl:(NSString *)url animated:animated fromEntrypoint:nil result:nil + fromURL:nil + prevURL:nil poppedResult:poppedResult]; } @@ -190,12 +218,15 @@ + (void) pushUrl:(NSString *)url params:(id)params animated:(BOOL)animated result:(ThrioNumberCallback)result + fromURL:(NSString *_Nullable)fromURL poppedResult:(ThrioIdCallback)poppedResult { [self _pushUrl:url params:params animated:animated fromEntrypoint:nil result:result + fromURL:fromURL + prevURL:nil poppedResult:poppedResult]; } @@ -484,6 +515,9 @@ + (FlutterEngine *)getEngineByViewContontroller:(NavigatorFlutterViewController return [NavigatorFlutterEngineFactory.shared getEngineByEntrypoint:entrypoint].flutterEngine; } ++ (void)pushUrl:(nonnull NSString *)url params:(nonnull id)params animated:(BOOL)animated result:(nonnull ThrioNumberCallback)result poppedResult:(nonnull ThrioIdCallback)poppedResult { +} + @end NS_ASSUME_NONNULL_END diff --git a/ios/Classes/Navigator/UINavigationController+Navigator.h b/ios/Classes/Navigator/UINavigationController+Navigator.h index 3e92f2f..edb950b 100644 --- a/ios/Classes/Navigator/UINavigationController+Navigator.h +++ b/ios/Classes/Navigator/UINavigationController+Navigator.h @@ -32,6 +32,8 @@ NS_ASSUME_NONNULL_BEGIN animated:(BOOL)animated fromEntrypoint:(NSString *_Nullable)fromEntrypoint result:(ThrioNumberCallback _Nullable)result + fromURL:(NSString *_Nullable)fromURL + prevURL:(NSString *_Nullable)prevURL poppedResult:(ThrioIdCallback _Nullable)poppedResult; - (BOOL)thrio_notifyUrl:(NSString *_Nullable)url diff --git a/ios/Classes/Navigator/UINavigationController+Navigator.m b/ios/Classes/Navigator/UINavigationController+Navigator.m index 8d3696a..41a4a1a 100644 --- a/ios/Classes/Navigator/UINavigationController+Navigator.m +++ b/ios/Classes/Navigator/UINavigationController+Navigator.m @@ -69,6 +69,8 @@ - (void)thrio_pushUrl:(NSString *)url animated:(BOOL)animated fromEntrypoint:(NSString *_Nullable)fromEntrypoint result:(ThrioNumberCallback _Nullable)result + fromURL:(NSString *_Nullable)fromURL + prevURL:(NSString *_Nullable)prevURL poppedResult:(ThrioIdCallback _Nullable)poppedResult { @synchronized (self) { UIViewController *viewController = [self thrio_createNativeViewControllerWithUrl:url params:params]; @@ -79,6 +81,8 @@ - (void)thrio_pushUrl:(NSString *)url animated:animated fromEntrypoint:fromEntrypoint result:result + fromURL:fromURL + prevURL:prevURL poppedResult:poppedResult]; } else { NSString *entrypoint = kNavigatorDefaultEntrypoint; @@ -103,6 +107,8 @@ - (void)thrio_pushUrl:(NSString *)url animated:animated fromEntrypoint:fromEntrypoint result:resultBlock + fromURL:fromURL + prevURL:prevURL poppedResult:poppedResult]; } else { __weak typeof(self) weakself = self; @@ -116,6 +122,8 @@ - (void)thrio_pushUrl:(NSString *)url animated:animated fromEntrypoint:fromEntrypoint result:result + fromURL:fromURL + prevURL:prevURL poppedResult:poppedResult]; }; [NavigatorFlutterEngineFactory.shared startupWithEntrypoint:entrypoint readyBlock:readyBlock]; @@ -522,8 +530,8 @@ - (void)thrio_pushViewController:(UIViewController *)viewController animated:(BO [self thrio_pushViewController:viewController animated:animated]; return; } - if (!self.topViewController || !self.topViewController.thrio_hidesNavigationBar_ || - ![viewController.thrio_hidesNavigationBar_ isEqualToNumber:self.topViewController.thrio_hidesNavigationBar_]) { + if (!self.topViewController || !self.topViewController.thrio_hidesNavigationBar_ || + ![viewController.thrio_hidesNavigationBar_ isEqualToNumber:self.topViewController.thrio_hidesNavigationBar_]) { [self setNavigationBarHidden:viewController.thrio_hidesNavigationBar_.boolValue animated:NO]; } @@ -621,7 +629,7 @@ - (UIViewController *_Nullable)thrio_popViewControllerAnimated:(BOOL)animated { if ([previousVC isKindOfClass:NavigatorFlutterViewController.class]) { [NavigatorFlutterEngineFactory.shared pushViewController:(NavigatorFlutterViewController *)previousVC]; } - + UIViewController *vc; if (animated) { [CATransaction begin]; @@ -686,7 +694,7 @@ - (void)thrio_setViewControllers:(NSArray *)viewControllers } } } - + [self thrio_setViewControllers:viewControllers]; } @@ -754,6 +762,8 @@ - (void)thrio_pushViewController:(UIViewController *)viewController animated:(BOOL)animated fromEntrypoint:(NSString *_Nullable)fromEntrypoint result:(ThrioNumberCallback _Nullable)result + fromURL:(NSString *_Nullable)fromURL + prevURL:(NSString *_Nullable)prevURL poppedResult:(ThrioIdCallback _Nullable)poppedResult { if (viewController) { NavigatorPageRoute *lastRoute = [ThrioNavigator getLastRouteByUrl:url]; @@ -772,7 +782,10 @@ - (void)thrio_pushViewController:(UIViewController *)viewController if (result) { result(idx); } - } poppedResult:poppedResult]; + } + fromURL:fromURL + prevURL:prevURL + poppedResult:poppedResult]; } } diff --git a/ios/Classes/Navigator/UIViewController+Navigator.h b/ios/Classes/Navigator/UIViewController+Navigator.h index 90332bb..457e024 100644 --- a/ios/Classes/Navigator/UIViewController+Navigator.h +++ b/ios/Classes/Navigator/UIViewController+Navigator.h @@ -43,6 +43,8 @@ NS_ASSUME_NONNULL_BEGIN animated:(BOOL)animated fromEntrypoint:(NSString *_Nullable)entrypoint result:(ThrioNumberCallback _Nullable)result + fromURL:(NSString *_Nullable)fromURL + prevURL:(NSString *_Nullable)prevURL poppedResult:(ThrioIdCallback _Nullable)poppedResult; - (BOOL)thrio_notifyUrl:(NSString *_Nullable)url diff --git a/ios/Classes/Navigator/UIViewController+Navigator.m b/ios/Classes/Navigator/UIViewController+Navigator.m index 443eb66..3434306 100644 --- a/ios/Classes/Navigator/UIViewController+Navigator.m +++ b/ios/Classes/Navigator/UIViewController+Navigator.m @@ -84,6 +84,8 @@ - (void)thrio_pushUrl:(NSString *)url animated:(BOOL)animated fromEntrypoint:(NSString *_Nullable)fromEntrypoint result:(ThrioNumberCallback _Nullable)result + fromURL:(NSString * _Nullable)fromURL + prevURL:(NSString *_Nullable)prevURL poppedResult:(ThrioIdCallback _Nullable)poppedResult { if (self.thrio_routeType != NavigatorRouteTypeNone) { if (result) { @@ -95,7 +97,9 @@ - (void)thrio_pushUrl:(NSString *)url NavigatorRouteSettings *settings = [NavigatorRouteSettings settingsWithUrl:url index:index nested:self.thrio_firstRoute != nil - params:params]; + params:params + fromURL:fromURL + prevURL:prevURL]; NavigatorPageRoute *newRoute = [NavigatorPageRoute routeWithSettings:settings]; newRoute.fromEntrypoint = fromEntrypoint; newRoute.poppedResult = poppedResult; @@ -396,7 +400,9 @@ - (void)thrio_replaceUrl:(NSString *)url NavigatorRouteSettings *newSettings = [NavigatorRouteSettings settingsWithUrl:newUrl index:newIndex nested:oldRoute.settings.nested - params:nil]; + params:nil + fromURL:nil + prevURL:nil]; [[oldRoute initWithSettings:newSettings] removeNotify]; } if (result) { diff --git a/lib/src/module/module_types.dart b/lib/src/module/module_types.dart index 14fc6ac..ae162ee 100644 --- a/lib/src/module/module_types.dart +++ b/lib/src/module/module_types.dart @@ -42,6 +42,7 @@ typedef NavigatorRouteCustomHandler = FutureOr TParams? params, bool animated, NavigatorIntCallback? result, + String? fromURL, }); final _queryParamsDecodedOf = Expando(); diff --git a/lib/src/navigator/navigator_page_observer_channel.dart b/lib/src/navigator/navigator_page_observer_channel.dart index 0b7e518..effd0e6 100644 --- a/lib/src/navigator/navigator_page_observer_channel.dart +++ b/lib/src/navigator/navigator_page_observer_channel.dart @@ -47,13 +47,13 @@ class NavigatorPageObserverChannel { final ThrioChannel _channel; void willAppear(RouteSettings routeSettings, NavigatorRouteType routeType) { - final arguments = routeSettings.toArguments()..remove('params'); + final arguments = routeSettings.toArgumentsWithoutParams(); arguments['routeType'] = routeType.toString().split('.').last; _channel.invokeMethod('willAppear', arguments); } void didAppear(RouteSettings routeSettings, NavigatorRouteType routeType) { - final arguments = routeSettings.toArguments()..remove('params'); + final arguments = routeSettings.toArgumentsWithoutParams(); arguments['routeType'] = routeType.toString().split('.').last; _channel.invokeMethod('didAppear', arguments); } @@ -62,13 +62,13 @@ class NavigatorPageObserverChannel { RouteSettings routeSettings, NavigatorRouteType routeType, ) { - final arguments = routeSettings.toArguments()..remove('params'); + final arguments = routeSettings.toArgumentsWithoutParams(); arguments['routeType'] = routeType.toString().split('.').last; _channel.invokeMethod('willDisappear', arguments); } void didDisappear(RouteSettings routeSettings, NavigatorRouteType routeType) { - final arguments = routeSettings.toArguments()..remove('params'); + final arguments = routeSettings.toArgumentsWithoutParams(); arguments['routeType'] = routeType.toString().split('.').last; _channel.invokeMethod('didDisappear', arguments); } diff --git a/lib/src/navigator/navigator_route_observer_channel.dart b/lib/src/navigator/navigator_route_observer_channel.dart index 91ec1a0..2474889 100644 --- a/lib/src/navigator/navigator_route_observer_channel.dart +++ b/lib/src/navigator/navigator_route_observer_channel.dart @@ -50,30 +50,30 @@ class NavigatorRouteObserverChannel with NavigatorRouteObserver { @override void didPush(RouteSettings routeSettings) => _channel.invokeMethod( - 'didPush', routeSettings.toArguments()..remove('params')); + 'didPush', routeSettings.toArgumentsWithoutParams()); @override void didPop(RouteSettings routeSettings) { verbose('didPop: ${routeSettings.name}'); _channel.invokeMethod( - 'didPop', routeSettings.toArguments()..remove('params')); + 'didPop', routeSettings.toArgumentsWithoutParams()); } @override void didPopTo(RouteSettings routeSettings) => _channel.invokeMethod( - 'didPopTo', routeSettings.toArguments()..remove('params')); + 'didPopTo', routeSettings.toArgumentsWithoutParams()); @override void didRemove(RouteSettings routeSettings) => _channel.invokeMethod( - 'didRemove', routeSettings.toArguments()..remove('params')); + 'didRemove', routeSettings.toArgumentsWithoutParams()); @override void didReplace( RouteSettings newRouteSettings, RouteSettings oldRouteSettings, ) { - final oldArgs = oldRouteSettings.toArguments()..remove('params'); - final newArgs = newRouteSettings.toArguments()..remove('params'); + final oldArgs = oldRouteSettings.toArgumentsWithoutParams(); + final newArgs = newRouteSettings.toArgumentsWithoutParams(); _channel.invokeMethod('didReplace', { 'oldRouteSettings': oldArgs, 'newRouteSettings': newArgs, diff --git a/lib/src/navigator/navigator_route_receive_channel.dart b/lib/src/navigator/navigator_route_receive_channel.dart index 0fb9b23..c141dfb 100644 --- a/lib/src/navigator/navigator_route_receive_channel.dart +++ b/lib/src/navigator/navigator_route_receive_channel.dart @@ -51,6 +51,11 @@ class NavigatorRouteReceiveChannel { 'push: url->${routeSettings.url} ' 'index->${routeSettings.index}', ); + if (routeSettings.prevURL?.isEmpty ?? true) { + final prevSettings = + await ThrioNavigatorImplement.shared().lastRoute(); + routeSettings.prevURL = prevSettings?.url; + } routeSettings.params = _deserializeParams(routeSettings.url, routeSettings.params); final animated = arguments?['animated'] == true; diff --git a/lib/src/navigator/navigator_route_send_channel.dart b/lib/src/navigator/navigator_route_send_channel.dart index 68448ec..5c70379 100644 --- a/lib/src/navigator/navigator_route_send_channel.dart +++ b/lib/src/navigator/navigator_route_send_channel.dart @@ -40,13 +40,16 @@ class NavigatorRouteSendChannel { required String url, TParams? params, bool animated = true, + String? fromURL, }) async { final arguments = { 'url': url, 'animated': animated, 'params': _serializeParams(url: url, params: params), }; - + if (fromURL?.isNotEmpty == true) { + arguments['fromURL'] = fromURL; + } return _channel .invokeMethod('push', arguments) .then((value) => value ?? 0); diff --git a/lib/src/navigator/navigator_route_settings.dart b/lib/src/navigator/navigator_route_settings.dart index bb106fb..14f0a2b 100644 --- a/lib/src/navigator/navigator_route_settings.dart +++ b/lib/src/navigator/navigator_route_settings.dart @@ -65,20 +65,34 @@ extension NavigatorRouteSettings on RouteSettings { final isNested = arguments['isNested'] == true; final animated = arguments['animated'] == true; final params = arguments['params']; + final fromURLValue = arguments['fromURL']; + final fromURL = fromURLValue is String ? fromURLValue : null; + final prevURLValue = arguments['prevURL']; + final prevURL = prevURLValue is String ? prevURLValue : null; + final args = { + 'isNested': isNested, + 'animated': animated, + }; + if (params != null) { + args['params'] = params; + } + if (fromURL?.isNotEmpty == true) { + args['fromURL'] = fromURL; + } + if (prevURL?.isNotEmpty == true) { + args['prevURL'] = prevURL; + } return RouteSettings( name: '$index $url', - arguments: { - 'isNested': isNested, - 'params': params, - 'animated': animated, - }, + arguments: args, ); } return null; } static RouteSettings? fromNewUrlArguments( - final Map? arguments) { + final Map? arguments, + ) { if ((arguments != null && arguments.isNotEmpty) && arguments.containsKey('newUrl') && arguments.containsKey('newIndex')) { @@ -96,11 +110,19 @@ extension NavigatorRouteSettings on RouteSettings { return null; } - Map toArguments() => { - 'url': url, - 'index': index, - 'params': params, - }; + Map toArgumentsWithoutParams() { + final args = { + 'isNested': isNested, + 'animated': animated, + }; + if (fromURL?.isNotEmpty == true) { + args['fromURL'] = fromURL; + } + if (prevURL?.isNotEmpty == true) { + args['prevURL'] = prevURL; + } + return args; + } /// Indicates whether this route is generated by build /// @@ -156,29 +178,56 @@ extension NavigatorRouteSettings on RouteSettings { } bool get isNested { - if (arguments != null && arguments is Map) { - return (arguments as Map)['isNested'] == true; + final args = arguments; + if (args != null && args is Map) { + return args['isNested'] == true; } return false; } bool get animated { - if (arguments != null && arguments is Map) { - return (arguments as Map)['animated'] == true; + final args = arguments; + if (args != null && args is Map) { + return args['animated'] == true; } return false; } dynamic get params { - if (arguments != null && arguments is Map) { - return (arguments as Map)['params']; + final args = arguments; + if (args != null && args is Map) { + return args['params']; } return null; } set params(dynamic value) { - if (arguments != null && arguments is Map) { - (arguments as Map)['params'] = value; + final args = arguments; + if (args != null && args is Map) { + args['params'] = value; + } + } + + String? get fromURL { + final args = arguments; + if (args != null && args is Map) { + return args['fromURL'] as String?; + } + return null; + } + + String? get prevURL { + final args = arguments; + if (args != null && args is Map) { + return args['prevURL'] as String?; + } + return null; + } + + set prevURL(String? value) { + final args = arguments; + if (args != null && args is Map) { + args['prevURL'] = value; } } } diff --git a/lib/src/navigator/navigator_types.dart b/lib/src/navigator/navigator_types.dart index 93d3df3..2784cc8 100644 --- a/lib/src/navigator/navigator_types.dart +++ b/lib/src/navigator/navigator_types.dart @@ -67,6 +67,7 @@ typedef NavigatorRoutePushHandle = Future /// Signature of push begin/return handler with url. typedef NavigatorPushHandle = Future Function( - String url, + String url, { TParams? params, -); + String? fromURL, +}); diff --git a/lib/src/navigator/thrio_navigator.dart b/lib/src/navigator/thrio_navigator.dart index 313fe8a..3cfbba6 100644 --- a/lib/src/navigator/thrio_navigator.dart +++ b/lib/src/navigator/thrio_navigator.dart @@ -50,12 +50,14 @@ abstract class ThrioNavigator { TParams? params, bool animated = true, NavigatorIntCallback? result, + String? fromURL, }) => ThrioNavigatorImplement.shared().push( url: url, params: params, animated: animated, result: result, + fromURL: fromURL, ); /// Push the page onto the navigation stack, and remove all old page. @@ -68,12 +70,14 @@ abstract class ThrioNavigator { TParams? params, bool animated = true, NavigatorIntCallback? result, + String? fromURL, }) => ThrioNavigatorImplement.shared().pushSingle( url: url, params: params, animated: animated, result: result, + fromURL: fromURL, ); /// Push the page onto the navigation stack, and remove the top page. @@ -86,12 +90,14 @@ abstract class ThrioNavigator { TParams? params, bool animated = true, NavigatorIntCallback? result, + String? fromURL, }) => ThrioNavigatorImplement.shared().pushReplace( url: url, params: params, animated: animated, result: result, + fromURL: fromURL, ); /// Push the page onto the navigation stack, and remove until the last page with `toUrl`. @@ -105,6 +111,7 @@ abstract class ThrioNavigator { TParams? params, bool animated = true, NavigatorIntCallback? result, + String? fromURL, }) => ThrioNavigatorImplement.shared().pushAndRemoveTo( url: url, @@ -112,6 +119,7 @@ abstract class ThrioNavigator { params: params, animated: animated, result: result, + fromURL: fromURL, ); /// Push the page onto the navigation stack, and remove until the first page with `toUrl`. @@ -125,6 +133,7 @@ abstract class ThrioNavigator { TParams? params, bool animated = true, NavigatorIntCallback? result, + String? fromURL, }) => ThrioNavigatorImplement.shared() .pushAndRemoveToFirst( @@ -133,6 +142,7 @@ abstract class ThrioNavigator { params: params, animated: animated, result: result, + fromURL: fromURL, ); /// Push the page onto the navigation stack, and remove until the last page with `toUrl` satisfies the `predicate`. @@ -146,6 +156,7 @@ abstract class ThrioNavigator { TParams? params, bool animated = true, NavigatorIntCallback? result, + String? fromURL, }) => ThrioNavigatorImplement.shared().pushAndRemoveUntil( url: url, @@ -153,6 +164,7 @@ abstract class ThrioNavigator { params: params, animated: animated, result: result, + fromURL: fromURL, ); /// Push the page onto the navigation stack, and remove until the first page with `toUrl` satisfies the `predicate`. @@ -166,6 +178,7 @@ abstract class ThrioNavigator { TParams? params, bool animated = true, NavigatorIntCallback? result, + String? fromURL, }) => ThrioNavigatorImplement.shared() .pushAndRemoveUntilFirst( @@ -174,6 +187,7 @@ abstract class ThrioNavigator { params: params, animated: animated, result: result, + fromURL: fromURL, ); /// Send a notification to all page. diff --git a/lib/src/navigator/thrio_navigator_implement.dart b/lib/src/navigator/thrio_navigator_implement.dart index 2103fe4..2adbaee 100644 --- a/lib/src/navigator/thrio_navigator_implement.dart +++ b/lib/src/navigator/thrio_navigator_implement.dart @@ -157,26 +157,29 @@ class ThrioNavigatorImplement { TParams? params, bool animated = true, NavigatorIntCallback? result, + String? fromURL, }) async { - await _onPushBeginHandle(url: url, params: params); + await _onPushBeginHandle(url: url, params: params, fromURL: fromURL); final completer = Completer(); final handled = await _pushToHandler( - url, - params, - animated, - completer, - result, + url: url, + params: params, + animated: animated, + completer: completer, + result: result, + fromURL: fromURL, ); if (!handled) { Future pushFuture() { final resultCompleter = Completer(); _pushToNative( - url, - params, - animated, - completer, + url: url, + params: params, + animated: animated, + completer: completer, + fromURL: fromURL, ).then((index) { resultCompleter.complete(); result?.call(index); @@ -193,18 +196,20 @@ class ThrioNavigatorImplement { Future _onPushBeginHandle({ required String url, TParams? params, + String? fromURL, }) async { for (final handle in _pushBeginHandlers) { - await handle(url, params); + await handle(url, params: params, fromURL: fromURL); } } Future _onPushReturnHandle({ required String url, TParams? params, + String? fromURL, }) async { for (final handle in _pushReturnHandlers) { - await handle(url, params); + await handle(url, params: params, fromURL: fromURL); } } @@ -214,6 +219,7 @@ class ThrioNavigatorImplement { TParams? params, bool animated = true, NavigatorIntCallback? result, + String? fromURL, }) async { final queryParametersAll = handler.queryParamsDecoded ? uri.queryParametersAll @@ -232,23 +238,35 @@ class ThrioNavigatorImplement { TParams? params, bool animated = true, NavigatorIntCallback? result, + String? fromURL, }) async { - await _onPushBeginHandle(url: url, params: params); + await _onPushBeginHandle(url: url, params: params, fromURL: fromURL); final completer = Completer(); - final handled = - await _pushToHandler(url, params, animated, completer, (index) async { - if (index > 0) { - await removeAll(url: url, excludeIndex: index); - } - result?.call(index); - }); + final handled = await _pushToHandler( + url: url, + params: params, + animated: animated, + completer: completer, + result: (index) async { + if (index > 0) { + await removeAll(url: url, excludeIndex: index); + } + result?.call(index); + }, + fromURL: fromURL, + ); if (!handled) { Future pushFuture() { final resultCompleter = Completer(); - _pushToNative(url, params, animated, completer) - .then((index) async { + _pushToNative( + url: url, + params: params, + animated: animated, + completer: completer, + fromURL: fromURL, + ).then((index) async { if (index > 0) { await removeAll(url: url, excludeIndex: index); } @@ -269,8 +287,9 @@ class ThrioNavigatorImplement { TParams? params, bool animated = true, NavigatorIntCallback? result, + String? fromURL, }) async { - await _onPushBeginHandle(url: url, params: params); + await _onPushBeginHandle(url: url, params: params, fromURL: fromURL); final completer = Completer(); @@ -278,13 +297,19 @@ class ThrioNavigatorImplement { if (lastSetting == null) { throw ThrioException('no route to replace'); } - final handled = - await _pushToHandler(url, params, animated, completer, (index) async { - if (index > 0) { - await remove(url: lastSetting.url, index: lastSetting.index); - } - result?.call(index); - }); + final handled = await _pushToHandler( + url: url, + params: params, + animated: animated, + completer: completer, + result: (index) async { + if (index > 0) { + await remove(url: lastSetting.url, index: lastSetting.index); + } + result?.call(index); + }, + fromURL: fromURL, + ); if (!handled) { Future pushFuture() async { final resultCompleter = Completer(); @@ -292,9 +317,13 @@ class ThrioNavigatorImplement { if (lastSetting == null) { throw ThrioException('no route to replace'); } - unawaited( - _pushToNative(url, params, animated, completer) - .then((index) async { + unawaited(_pushToNative( + url: url, + params: params, + animated: animated, + completer: completer, + fromURL: fromURL, + ).then((index) async { resultCompleter.complete(); if (index > 0) { await remove(url: lastSetting.url, index: lastSetting.index); @@ -316,8 +345,9 @@ class ThrioNavigatorImplement { TParams? params, bool animated = true, NavigatorIntCallback? result, + String? fromURL, }) async { - await _onPushBeginHandle(url: url, params: params); + await _onPushBeginHandle(url: url, params: params, fromURL: fromURL); final completer = Completer(); @@ -327,13 +357,19 @@ class ThrioNavigatorImplement { result?.call(0); } - final handled = - await _pushToHandler(url, params, animated, completer, (index) async { - if (index > 0) { - await removeBelowUntil(predicate: (url) => url == toUrl); - } - result?.call(index); - }); + final handled = await _pushToHandler( + url: url, + params: params, + animated: animated, + completer: completer, + result: (index) async { + if (index > 0) { + await removeBelowUntil(predicate: (url) => url == toUrl); + } + result?.call(index); + }, + fromURL: fromURL, + ); if (!handled) { Future pushFuture() async { final resultCompleter = Completer(); @@ -343,9 +379,13 @@ class ThrioNavigatorImplement { result?.call(0); resultCompleter.complete(); } - unawaited( - _pushToNative(url, params, animated, completer) - .then((index) async { + unawaited(_pushToNative( + url: url, + params: params, + animated: animated, + completer: completer, + fromURL: fromURL, + ).then((index) async { resultCompleter.complete(); if (index > 0) { await removeBelowUntil(predicate: (url) => url == toUrl); @@ -367,8 +407,9 @@ class ThrioNavigatorImplement { TParams? params, bool animated = true, NavigatorIntCallback? result, + String? fromURL, }) async { - await _onPushBeginHandle(url: url, params: params); + await _onPushBeginHandle(url: url, params: params, fromURL: fromURL); final completer = Completer(); @@ -377,13 +418,19 @@ class ThrioNavigatorImplement { if (route == null) { result?.call(0); } - final handled = - await _pushToHandler(url, params, animated, completer, (index) async { - if (index > 0) { - await removeBelowUntilFirst(predicate: (url) => url == toUrl); - } - result?.call(index); - }); + final handled = await _pushToHandler( + url: url, + params: params, + animated: animated, + completer: completer, + result: (index) async { + if (index > 0) { + await removeBelowUntilFirst(predicate: (url) => url == toUrl); + } + result?.call(index); + }, + fromURL: fromURL, + ); if (!handled) { Future pushFuture() async { final resultCompleter = Completer(); @@ -393,9 +440,13 @@ class ThrioNavigatorImplement { result?.call(0); resultCompleter.complete(); } - unawaited( - _pushToNative(url, params, animated, completer) - .then((index) async { + unawaited(_pushToNative( + url: url, + params: params, + animated: animated, + completer: completer, + fromURL: fromURL, + ).then((index) async { resultCompleter.complete(); if (index > 0) { await removeBelowUntilFirst(predicate: (url) => url == toUrl); @@ -417,8 +468,9 @@ class ThrioNavigatorImplement { TParams? params, bool animated = true, NavigatorIntCallback? result, + String? fromURL, }) async { - await _onPushBeginHandle(url: url, params: params); + await _onPushBeginHandle(url: url, params: params, fromURL: fromURL); final completer = Completer(); @@ -429,13 +481,19 @@ class ThrioNavigatorImplement { result?.call(0); } - final handled = - await _pushToHandler(url, params, animated, completer, (index) async { - if (index > 0) { - await removeBelowUntil(predicate: predicate); - } - result?.call(index); - }); + final handled = await _pushToHandler( + url: url, + params: params, + animated: animated, + completer: completer, + result: (index) async { + if (index > 0) { + await removeBelowUntil(predicate: predicate); + } + result?.call(index); + }, + fromURL: fromURL, + ); if (!handled) { Future pushFuture() async { final resultCompleter = Completer(); @@ -446,9 +504,13 @@ class ThrioNavigatorImplement { resultCompleter.complete(); result?.call(0); } - unawaited( - _pushToNative(url, params, animated, completer) - .then((index) async { + unawaited(_pushToNative( + url: url, + params: params, + animated: animated, + completer: completer, + fromURL: fromURL, + ).then((index) async { resultCompleter.complete(); if (index > 0) { await removeBelowUntil(predicate: predicate); @@ -470,8 +532,9 @@ class ThrioNavigatorImplement { TParams? params, bool animated = true, NavigatorIntCallback? result, + String? fromURL, }) async { - await _onPushBeginHandle(url: url, params: params); + await _onPushBeginHandle(url: url, params: params, fromURL: fromURL); final completer = Completer(); @@ -482,13 +545,19 @@ class ThrioNavigatorImplement { result?.call(0); } - final handled = - await _pushToHandler(url, params, animated, completer, (index) async { - if (index > 0) { - await removeBelowUntilFirst(predicate: predicate); - } - result?.call(index); - }); + final handled = await _pushToHandler( + url: url, + params: params, + animated: animated, + completer: completer, + result: (index) async { + if (index > 0) { + await removeBelowUntilFirst(predicate: predicate); + } + result?.call(index); + }, + fromURL: fromURL, + ); if (!handled) { Future pushFuture() async { final resultCompleter = Completer(); @@ -499,9 +568,13 @@ class ThrioNavigatorImplement { resultCompleter.complete(); result?.call(0); } - unawaited( - _pushToNative(url, params, animated, completer) - .then((index) async { + unawaited(_pushToNative( + url: url, + params: params, + animated: animated, + completer: completer, + fromURL: fromURL, + ).then((index) async { resultCompleter.complete(); if (index > 0) { await removeBelowUntilFirst(predicate: predicate); @@ -517,13 +590,14 @@ class ThrioNavigatorImplement { return completer.future; } - Future _pushToHandler( - String url, + Future _pushToHandler({ + required String url, TParams? params, - bool animated, - Completer completer, + required bool animated, + required Completer completer, NavigatorIntCallback? result, - ) async { + String? fromURL, + }) async { var handled = false; final uri = Uri.parse(url); var handler = @@ -556,12 +630,13 @@ class ThrioNavigatorImplement { return handled; } - Future _pushToNative( - String url, + Future _pushToNative({ + required String url, TParams? params, - bool animated, - Completer completer, - ) { + required bool animated, + required Completer completer, + String? fromURL, + }) { final qidx = url.indexOf('?'); final ps = params ?? {}; var noQueryUrl = url; @@ -574,11 +649,16 @@ class ThrioNavigatorImplement { noQueryUrl = url.substring(0, qidx); } unawaited(completer.future.then((value) { - _onPushReturnHandle(url: url, params: params); + _onPushReturnHandle(url: url, params: params, fromURL: fromURL); })); return _sendChannel - .push(url: noQueryUrl, params: ps, animated: animated) + .push( + url: noQueryUrl, + params: ps, + animated: animated, + fromURL: fromURL, + ) .then((index) { if (index > 0) { final routeName = '$index $noQueryUrl'; diff --git a/pubspec.yaml b/pubspec.yaml index 3e4add5..4e4db3c 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -1,6 +1,6 @@ name: flutter_thrio description: Thrio makes it easy and fast to add flutter to existing mobile applications, and provide a simple and consistent navigator APIs. -version: 4.10.0 +version: 4.11.0 homepage: https://github.com/flutter-thrio/flutter_thrio environment: