ai-coding
2026-06-29 ddb609636755a8b0dc80eb02a7ad173fdfc7806d
feat: 重建时暂停 translateMarker

Co-Authored-By: ai-coding <ai-coding@devgenie.local>
6个文件已修改
63 ■■■■■ 已修改文件
src/robotaxi/pages/begin-route/hooks/use-map-markers.ts 11 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/robotaxi/pages/begin-route/hooks/use-vehicle-tracking.ts 17 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/robotaxi/pages/begin-route/index.tsx 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/robotaxi/pages/share-trip/hooks/use-map-markers.ts 11 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/robotaxi/pages/share-trip/hooks/use-vehicle-tracking.ts 17 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/robotaxi/pages/share-trip/index.tsx 4 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/robotaxi/pages/begin-route/hooks/use-map-markers.ts
@@ -60,6 +60,7 @@
  arrivedMarkerReady: boolean;
  arrivedTooltipReady: boolean;
  onVehicleMarkerReady: () => void;
  onCarMarkerWillRebuild: () => void;
};
const defaultDeps: Deps = {
@@ -76,7 +77,8 @@
  vehicleMarkerId: 3,
  arrivedMarkerReady: false,
  arrivedTooltipReady: false,
  onVehicleMarkerReady: () => { }
  onVehicleMarkerReady: () => { },
  onCarMarkerWillRebuild: () => { }
};
export default function useMapMarkers(rawDeps?: Partial<Deps>) {
@@ -106,6 +108,8 @@
      setDisplayMarkers(markers);
      return;
    }
    // 通知外部:CarMarker 即将重建,请暂停 translateMarker
    deps.onCarMarkerWillRebuild();
    // 第一步:展示层先去掉车标,原生层销毁旧 car marker
    setDisplayMarkers(markers.filter((m: any) => m.id !== deps.vehicleMarkerId));
    // 第二步:下一帧恢复完整列表,原生层重建 car marker(清除 translateMarker 遗留的旋转矩阵)
@@ -310,14 +314,15 @@
  }, [markers]);
  useEffect(() => {
    const hasVehicleMarker = deps.statusRule.showCar && markers.some((item: any) => item.id === deps.vehicleMarkerId);
    // 这里使用 displayMarkers 而非 markers(逻辑态),以保证 rebuild 完成(车标已真实渲染到原生地图)后才通知 ready
    const hasVehicleMarker = deps.statusRule.showCar && displayMarkers.some((item: any) => item.id === deps.vehicleMarkerId);
    if (!hasVehicleMarker) {
      return;
    }
    Taro.nextTick(() => {
      deps.onVehicleMarkerReady();
    });
  }, [markers, deps.statusRule.showCar, deps.vehicleMarkerId, deps.onVehicleMarkerReady]);
  }, [displayMarkers, deps.statusRule.showCar, deps.vehicleMarkerId, deps.onVehicleMarkerReady]);
  useEffect(() => {
    const pickupSite = deps.startSite?.latitude && deps.startSite?.longitude ? deps.startSite : Taro.getStorageSync('startSite');
src/robotaxi/pages/begin-route/hooks/use-vehicle-tracking.ts
@@ -238,6 +238,20 @@
    clearVehicleMarkerReadyTimer();
  }, []);
  /**
   * 暂停 translateMarker:清除 ready 状态、pending/lastApplied 任务,递增 session 让在飞回调失效。
   * 用于 CarMarker 重建期间阻止 translateMarker 作用于即将被销毁的旧 marker。
   * 后续调用 notifyVehicleMarkerReady 会重新走 ready 延时并 flush 平移任务。
   */
  const suspendVehicleMarker = useCallback(() => {
    isTranslatingRef.current = false;
    pendingTranslateRef.current = null;
    lastAppliedTranslateTaskRef.current = null;
    vehicleMarkerReadyRef.current = false;
    clearVehicleMarkerReadyTimer();
    translateSessionIdRef.current += 1;
  }, []);
  return {
    vehicleLocation,
    setVehicleLocation,
@@ -252,6 +266,7 @@
    lastVehiclePointRef,
    lastVehicleUpdateAtRef,
    updateVehicleLocationThrottled,
    notifyVehicleMarkerReady
    notifyVehicleMarkerReady,
    suspendVehicleMarker
  };
}
src/robotaxi/pages/begin-route/index.tsx
@@ -1053,7 +1053,8 @@
    beforeUserEndSite: isPickupRouteChangeMapMode ? null : beforeUserEndSite,
    arrivedMarkerReady,
    arrivedTooltipReady,
    onVehicleMarkerReady: vehicleState.notifyVehicleMarkerReady
    onVehicleMarkerReady: vehicleState.notifyVehicleMarkerReady,
    onCarMarkerWillRebuild: vehicleState.suspendVehicleMarker
  }); // 地图标记状态容器
  const {
    markers,
src/robotaxi/pages/share-trip/hooks/use-map-markers.ts
@@ -54,6 +54,7 @@
    vehicleMarkerId: number;
    arrivedMarkerReady: boolean;
    onVehicleMarkerReady: () => void;
    onCarMarkerWillRebuild: () => void;
};
const defaultDeps: Deps = {
@@ -66,7 +67,8 @@
    vehicleDirection: null,
    vehicleMarkerId: 3,
    arrivedMarkerReady: false,
    onVehicleMarkerReady: () => { }
    onVehicleMarkerReady: () => { },
    onCarMarkerWillRebuild: () => { }
};
export default function useMapMarkers(rawDeps?: Partial<Deps>) {
@@ -95,6 +97,8 @@
        setDisplayMarkers(markers);
        return;
      }
      // 通知外部:CarMarker 即将重建,请暂停 translateMarker
      deps.onCarMarkerWillRebuild();
      // 第一步:展示层先去掉车标,原生层销毁旧 car marker
      setDisplayMarkers(markers.filter((m: any) => m.id !== deps.vehicleMarkerId));
      // 第二步:下一帧恢复完整列表,原生层重建 car marker(清除 translateMarker 遗留的旋转矩阵)
@@ -296,14 +300,15 @@
    }, [markers]);
    useEffect(() => {
        const hasVehicleMarker = deps.statusRule.showCar && markers.some((item: any) => item.id === deps.vehicleMarkerId);
        // 这里使用 displayMarkers 而非 markers(逻辑态),以保证 rebuild 完成(车标已真实渲染到原生地图)后才通知 ready
        const hasVehicleMarker = deps.statusRule.showCar && displayMarkers.some((item: any) => item.id === deps.vehicleMarkerId);
        if (!hasVehicleMarker) {
            return;
        }
        Taro.nextTick(() => {
            deps.onVehicleMarkerReady();
        });
    }, [markers, deps.statusRule.showCar, deps.vehicleMarkerId, deps.onVehicleMarkerReady]);
    }, [displayMarkers, deps.statusRule.showCar, deps.vehicleMarkerId, deps.onVehicleMarkerReady]);
    useEffect(() => {
        const pickupSite =
src/robotaxi/pages/share-trip/hooks/use-vehicle-tracking.ts
@@ -231,6 +231,20 @@
        clearVehicleMarkerReadyTimer();
    }, []);
    /**
     * 暂停 translateMarker:清除 ready 状态、pending/lastApplied 任务,递增 session 让在飞回调失效。
     * 用于 CarMarker 重建期间阻止 translateMarker 作用于即将被销毁的旧 marker。
     * 后续调用 notifyVehicleMarkerReady 会重新走 ready 延时并 flush 平移任务。
     */
    const suspendVehicleMarker = useCallback(() => {
        isTranslatingRef.current = false;
        pendingTranslateRef.current = null;
        lastAppliedTranslateTaskRef.current = null;
        vehicleMarkerReadyRef.current = false;
        clearVehicleMarkerReadyTimer();
        translateSessionIdRef.current += 1;
    }, []);
    return {
        vehicleLocation,
        setVehicleLocation,
@@ -245,6 +259,7 @@
        lastVehiclePointRef,
        lastVehicleUpdateAtRef,
        updateVehicleLocationThrottled,
        notifyVehicleMarkerReady
        notifyVehicleMarkerReady,
        suspendVehicleMarker
    };
}
src/robotaxi/pages/share-trip/index.tsx
@@ -114,7 +114,8 @@
    setVehicleMoveAlongPoints,
    setVehicleDirection,
    updateVehicleLocationThrottled,
    notifyVehicleMarkerReady
    notifyVehicleMarkerReady,
    suspendVehicleMarker
  } = useVehicleTracking({
    statusRule,
    vehicleMarkerId,
@@ -133,6 +134,7 @@
    vehicleMarkerId,
    arrivedMarkerReady,
    onVehicleMarkerReady: notifyVehicleMarkerReady,
    onCarMarkerWillRebuild: suspendVehicleMarker,
  }); // 地图 marker 状态容器
  const {