Back to Flutter Boost

popUntil method

doc/api/flutter_boost_app/FlutterBoostAppState/popUntil.html

5.0.22.0 KB
Original Source

popUntil method

voidpopUntil(

  1. {String route,
  2. String uniqueId}

)

Implementation

void popUntil({String route,String uniqueId}) async{
  BoostContainer targetContainer;
  BoostPage targetPage;
  int popUntilIndex = containers.length;
  if(uniqueId != null){
    for (int index = containers.length - 1; index >= 0; index--) {
      for (BoostPage page in containers[index].pages) {
        if (uniqueId == page.pageInfo.uniqueId || uniqueId == containers[index].pageInfo.uniqueId) {
          //uniqueId优先级更高,优先匹配
          targetContainer = containers[index];
          targetPage = page;
          break;
        }
      }
      if (targetContainer != null){
        popUntilIndex = index;
        break;
      }
    }
  }

  if(targetContainer == null && route != null){
    for (int index = containers.length - 1; index>= 0; index --) {
      for (BoostPage page in containers[index].pages) {
        if (route == page.name) {
          targetContainer = containers[index];
          targetPage = page;
          break;
        }
      }
      if (targetContainer != null){
        popUntilIndex = index;
        break;
      }
    }
  }

  if (targetContainer != null && targetContainer != topContainer) {
    for (int index = containers.length - 1; index > popUntilIndex;index--){
      BoostContainer container = containers[index];
      final params = CommonParams()
        ..pageName = container.pageInfo.pageName
        ..uniqueId = container.pageInfo.uniqueId
        ..arguments = {"animated":false};
      await nativeRouterApi.popRoute(params);
    }

    if (targetContainer.topPage != targetPage) {
      Future<void>.delayed(
        const Duration(milliseconds: 50),
            () => targetContainer?.navigator?.popUntil(ModalRoute.withName(targetPage.name))
      );

    }
  } else {
    topContainer?.navigator?.popUntil(ModalRoute.withName(targetPage.name));
  }
}