navigateTo<T extends Object?, TO extends Object?> method
Navigate to Route
path
page path
body
page require arguments
replace
if ture will replace current page to navigate new page.
clearTrace
if ture will clear all page to navigate new page.
isSingleTop
if ture will only path is not current path navigate.
result
went replace is true, this will able.
pageTransitions
you navigate transition , if null will use default page transitions builder.
Implementation
Future<dynamic> navigateTo<T extends Object?, TO extends Object?>(String path,
{dynamic body,
bool? replace,
bool? clearTrace,
bool? isSingleTop,
TO? result,
PageTransitionsBuilder? pageTransitions}) async {
PageTransitionsBuilder? _pageTransitions;
WidgetBuilder? builder;
final ctx = Context(
path,
body: body,
);
if (_interceptor.length > 0) {
dynamic result;
for (final interceptor in _interceptor) {
result = await interceptor(ctx);
if (result == true) {
return;
}
}
}
NavigatorRoute? handler = _register.match(ctx.uri);
if (handler != null) {
final interceptor = handler.getInterceptor();
if (interceptor.length > 0) {
dynamic result;
for (final interceptor in interceptor) {
result = await interceptor(ctx);
if (result == true) {
return;
}
}
}
final result = await handler(ctx);
if (result is WidgetBuilder) {
builder = result;
_pageTransitions = pageTransitions ?? handler.defaultPageTransaction;
} else if (result is Redirect) {
return await navigateTo(result.path,
body: body,
replace: replace,
clearTrace: clearTrace,
isSingleTop: isSingleTop,
result: result,
pageTransitions: pageTransitions);
} else {
return SynchronousFuture(result);
}
} else {
builder = (BuildContext context) => _errorPage.notFoundPage(context, ctx);
}
_pageTransitions ??= _defaultTransitionBuilder;
dynamic navigateResult;
if (isSingleTop == true && _observer.topPath == path) {
return null;
}
if (isUseNavigator2 == true) {
if (clearTrace == true) {
navigateResult = await _delegate
.clearTracePush(_pageNamed(ctx, builder, _pageTransitions));
} else if (replace == true) {
navigateResult = await _delegate.replacePush<T, TO>(
_pageNamed(ctx, builder, _pageTransitions), result);
} else {
navigateResult =
await _delegate.push(_pageNamed(ctx, builder, _pageTransitions));
}
} else {
if (clearTrace == true) {
navigateResult = await navigator.pushAndRemoveUntil<T>(
_routeNamed<T>(ctx, builder, _pageTransitions), (check) => false);
} else {
navigateResult = replace == true
? await navigator.pushReplacement<T?, TO>(
_routeNamed<T>(ctx, builder, _pageTransitions),
result: result)
: await navigator
.push<T>(_routeNamed<T>(ctx, builder, _pageTransitions));
}
}
return SynchronousFuture(navigateResult);
}