addRoute method

void addRoute(
  1. AppRoute route
)

将路由添加到路由树

Implementation

void addRoute(AppRoute route) {
  String path = route.route;

  /// 是根或默认路由,只需添加
  if (path == Navigator.defaultRouteName) {
    if (_hasDefaultRoute) {
      /// 引发错误,影响路由器的内部一致性
      throw ("Default route was already defined");
    }

    /// 创建节点
    var node = RouteTreeNode(path, RouteTreeNodeType.component);
    node.routes = [route];
    _nodes.add(node);
    _hasDefaultRoute = true;
    return;
  }

  /// 非根路由 解析路径 判断是否是路径组成成分
  if (path.startsWith("/")) {
    path = path.substring(1);
  }

  List<String> pathComponents = path.split('/');
  RouteTreeNode? parent;

  /// 循环组成部分
  for (int i = 0; i < pathComponents.length; i++) {
    String component = pathComponents[i];

    RouteTreeNode? node = _nodeForComponent(component, parent);

    if (node == null) {
      /// 得到节点的类型
      RouteTreeNodeType type = _typeForComponent(component);

      /// 创建节点
      node = RouteTreeNode(component, type);

      /// 添加父母
      node.parent = parent;

      /// 添加孩子
      if (parent == null) {
        _nodes.add(node);
      } else {
        parent.nodes!.add(node);
      }
    }

    /// 结束生成路径 插入树
    if (i == pathComponents.length - 1) {
      if (node.routes == null) {
        node.routes = [route];
      } else {
        node.routes!.add(route);
      }
    }
    parent = node;
  }
}