updateRouteParam method

AFRouteState updateRouteParam(
  1. AFRouteParam param,
  2. List<AFRouteParam>? children,
  3. AFCreateDefaultChildParamDelegate? createDefaultChildParam
)

Replaces the data on the current leaf element without changing the segments in the route.

Implementation

AFRouteState updateRouteParam(AFRouteParam param, List<AFRouteParam>? children, AFCreateDefaultChildParamDelegate? createDefaultChildParam) {
  // in this case, we obviously don't want to set this value as the param. Instead,
  // we want to verify that it already exists, or else create it using the uiConfig's default
  // method.
  if(param is AFRouteParamRef) {
    return updateRouteParamWithExistingOrDefault(param);
  }

  if(param.hasChildWID) {
    return setChildParam(param);
  }


  var screen = param.screenId;
  var route = param.routeLocation;
  if(route == AFRouteLocation.screenHierarchy) {
    if(hasStartupWrapper && screen == AFibF.g.screenMap.startupScreenId) {
      screen = AFUIScreenID.screenStartupWrapper;
    }
    AFibD.logRouteAF?.d("updateHierarchyParam: $screen, $param");
    final seg = screenHierarchy.findSegmentFor(screen, includePrior: true);
    if(seg == null) {
      throw AFException("No route segment for screen $screen");
    }
    final merged = param.mergeOnWrite(seg.param);
    final revisedSeg = seg.copyWith(param: merged);
    return _reviseScreen(screenHierarchy.updateRouteSegment(screen, revisedSeg));
  } else {
    var globalSeg = globalPool[screen];
    if(globalSeg == null) {
      globalSeg = AFRouteSegment.withParam(param, children, createDefaultChildParam);
    } else {
       final merged = param.mergeOnWrite(globalSeg.param);
      if(param.wid == AFUIWidgetID.useScreenParam) {
        final childSegs = children != null ? AFRouteSegmentChildren.fromList(children) : null;
        globalSeg = globalSeg.copyWith(param: merged, children: childSegs);
      } else {
        globalSeg = globalSeg.reviseChild(merged);
      }
    }

    return setGlobalPoolParam(screen, globalSeg);
  }
}