handleActionToFlutter static method

Future? handleActionToFlutter(
  1. Map arguments
)

2.处理Native发过来的指令 argument里包含必选参数routeName,actionType,可选参数params

Implementation

static Future? handleActionToFlutter(Map arguments) {
  /// 处理实际跳转
  DNodeEntity nodeEntity = DNodeEntity.fromJson(arguments);
  debugPrint("【sendActionToFlutter】 \n"
      "【arguments】${nodeEntity.toJson()} \n"
      "【navigator】$_navigator ");
  final String? action = nodeEntity.action;
  switch (action) {
    case DStackConstant.push:
      continue Present;
    Present:
    case DStackConstant.present:
      {
        final DNode node = nodeEntity.nodeList.first;
        final Map? params = node.params;
        final bool? homePage = node.homePage;
        final PageType? pageType = node.pageType;
        final String? router = node.target;

        if (homePage != null &&
            homePage == true &&
            node.boundary != null &&
            node.boundary == true) {
          _hasReplaceHomePage = true;
          return replace(router, pageType,
              homePage: homePage, animated: false, params: node.params);
        } else {
          PageRoute route;
          bool? boundary = node.boundary;
          if (boundary != null && boundary) {
            /// 临界页面不开启动画
            route = DNavigatorManager.materialRoute(
              routeName: router,
              params: params,
              fullscreenDialog: action == DStackConstant.present,
              pushAnimated: false,
            );
          } else {
            route = DNavigatorManager.materialRoute(
                routeName: router,
                params: params,
                fullscreenDialog: action == DStackConstant.present);
          }
          node.identifier = identifierWithRoute(route);
          Map json = node.toJson();
          DStack.instance.channel!.sendUpdateBoundaryNode(json);
          return _navigator!.push(route);
        }
      }
      break;
    case DStackConstant.pop:
      {
        final DNode node = nodeEntity.nodeList.first;
        return DNavigatorManager.gardPop(node.params, nodeEntity.animated);
      }
      break;
    case DStackConstant.popTo:
      continue PopSkip;
    case DStackConstant.popToRoot:
      continue PopSkip;
    PopSkip:
    case DStackConstant.popSkip:
      {
        Future? pop;
        int length = nodeEntity.nodeList.length - 1;
        for (int i = length; i >= 0; i--) {
          final DNode node = nodeEntity.nodeList[i];
          bool? _animated = i == length;
          if (nodeEntity.animated == false) {
            _animated = nodeEntity.animated;
          }
          pop = DNavigatorManager.gardPop(node.params, _animated);
        }
        return pop;
      }
      break;
    case DStackConstant.dismiss:
      {
        final DNode node = nodeEntity.nodeList.first;
        return DNavigatorManager.gardPop(node.params, nodeEntity.animated);
      }
      break;
    case DStackConstant.gesture:
      {
        // native发消息过来时,需要处理返回至上一页
        final DNode node = nodeEntity.nodeList.first;
        DStackNavigatorObserver.instance!
            .setGesturingRouteName(DStackConstant.nativeDidPopGesture);
        return DNavigatorManager.gardPop(node.params);
      }
      break;
    case DStackConstant.replace:
      {
        if (_hasReplaceHomePage) {
          _hasReplaceHomePage = false;
          final DNode node = nodeEntity.nodeList.first;
          var route = DNavigatorManager.materialRoute(
              routeName: node.target,
              params: node.params,
              pushAnimated: false);
          return _navigator!.pushReplacement(route);
        }
        return Future.value(true);
      }
      break;
  }
  return null;
}