parseRouteInformationWithDependencies method

  1. @override
Future<RouteMatchList> parseRouteInformationWithDependencies(
  1. RouteInformation routeInformation,
  2. BuildContext context
)
override

Called by the Router. The

Implementation

@override
Future<RouteMatchList> parseRouteInformationWithDependencies(
  RouteInformation routeInformation,
  BuildContext context,
) {
  assert(routeInformation.state != null);
  final Object state = routeInformation.state!;

  if (state is! RouteInformationState) {
    // This is a result of browser backward/forward button or state
    // restoration. In this case, the route match list is already stored in
    // the state.
    final RouteMatchList matchList =
        _routeMatchListCodec.decode(state as Map<Object?, Object?>);
    return debugParserFuture = _redirect(context, matchList)
        .then<RouteMatchList>((RouteMatchList value) {
      if (value.isError && onParserException != null) {
        return onParserException!(context, value);
      }
      return value;
    });
  }

  late final RouteMatchList initialMatches;
  initialMatches =
      // TODO(chunhtai): remove this ignore and migrate the code
      // https://github.com/flutter/flutter/issues/124045.
      // ignore: deprecated_member_use, unnecessary_non_null_assertion
      configuration.findMatch(routeInformation.location!, extra: state.extra);
  if (initialMatches.isError) {
    // TODO(chunhtai): remove this ignore and migrate the code
    // https://github.com/flutter/flutter/issues/124045.
    // ignore: deprecated_member_use
    log.info('No initial matches: ${routeInformation.location}');
  }

  return debugParserFuture = _redirect(
    context,
    initialMatches,
  ).then<RouteMatchList>((RouteMatchList matchList) {
    if (matchList.isError && onParserException != null) {
      return onParserException!(context, matchList);
    }

    assert(() {
      if (matchList.isNotEmpty) {
        assert(!(matchList.last.route as GoRoute).redirectOnly,
            'A redirect-only route must redirect to location different from itself.\n The offending route: ${matchList.last.route}');
      }
      return true;
    }());
    return _updateRouteMatchList(
      matchList,
      baseRouteMatchList: state.baseRouteMatchList,
      completer: state.completer,
      type: state.type,
    );
  });
}