start method

Future<RouterDest> start(
  1. BuildContext context,
  2. String url, {
  3. Map<String, dynamic> params = const {},
  4. InterceptorManager? interceptorManager,
})

Implementation

Future<RouterDest> start(BuildContext context, String url,
    {Map<String, dynamic> params = const {}, InterceptorManager? interceptorManager}) async {
  try {
    var uri = Uri.parse(url);
    var component = _tree.findByUri(uri);
    component.addExtra(params);
    var result = await (interceptorManager ?? InterceptorManager())
        .runInterceptor(InterceptorContext(context, component));
    switch (result.status) {
      case RouterRunInterceptorResultStatus.pass:
        if (component.value == null) {
          print("Tetris lost: [$url}]");
          throw RouterError(RouterErrorType.lost, null);
        }
        return RouterDest(component, (component.value as _Holder).builder);
      case RouterRunInterceptorResultStatus.switched:
        if (result.url != null) {
          return start(context, result.url!, params: result.params);
        }
        assert(result.builder != null);
        return RouterDest(component, result.builder!);
      case RouterRunInterceptorResultStatus.rejected:
        print("Tetris rejected: [$url}]");
        throw RouterError(RouterErrorType.intercepted, result.error!);
      default:
        throw RouterError(RouterErrorType.other, result.error!);
    }
  } on RouterError catch (e) {
    throw e;
  } catch (error) {
    debugPrint(error.toString());
    throw RouterError(RouterErrorType.other, null);
  }
}