ai-coding
2026-06-26 63158ec17b1582adbd76f02c448aeedbdeb6e779
fix(map): updateViewportByPayload 加上防抖

Co-Authored-By: ai-coding <ai-coding@devgenie.local>
1个文件已修改
10 ■■■■■ 已修改文件
src/robotaxi/pages/begin-route/hooks/use-map-viewport.ts 10 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/robotaxi/pages/begin-route/hooks/use-map-viewport.ts
@@ -1,6 +1,6 @@
import Taro from '@tarojs/taro';
import { useState, useRef, useCallback, useMemo, useEffect } from 'react';
import { computeAdaptiveBottomPadding } from '../../../../utils/Robotaxi-public-method';
import { computeAdaptiveBottomPadding, debounce } from '../../../../utils/Robotaxi-public-method';
import { TripStatus } from '../../../constants/trip-status';
import { buildActiveTripSafeAreaMetrics } from './active-trip-camera-policy';
@@ -40,6 +40,8 @@
const ACTIVE_TRIP_VIEWPORT_SYNC_INTERVAL_MS = 600; // 行程安全区跟随的最小同步间隔,避免地图频繁漂移
const ACTIVE_TRIP_VIEWPORT_SYNC_ANIMATION_MS = 300; // 跟车中心移动缓动时长,等待原生地图动画后再回写受控中心点
const ORDER_DETAIL_SCALE_SYNC_DELAY_MS = 600; // 完成态 includePoints 后等待原生地图落稳,再同步实际 scale
const VIEWPORT_FIT_DEBOUNCE_MS = 300; // 视口 fit 统一防抖:状态切换瞬间路线点/视口类型会先残留旧值再被正确值覆盖,
                                      // 防抖把窗口内的多次 includePoints/moveToLocation 合并为最后一次,避免连续命令式调用动画相互打断导致缩放卡死
export const ACTIVE_TRIP_VIEWPORT_SAFE_X_MARGIN_RATIO = 0.2; // 横向两侧保留的边距比例,调大可让车辆更早触发横向回中,避免跑到贴边只剩一小段线路
type ViewportPoint = {
@@ -512,7 +514,7 @@
        }, ORDER_DETAIL_SCALE_SYNC_DELAY_MS);
    }, [deps.setLatitude, deps.setLongitude, deps.tripStatus, getMapCenterLocation, getMapScale]);
    const updateViewportByPayload = (viewportType: string, points: any[]) => {
    const updateViewportByPayloadRaw = (viewportType: string, points: any[]) => {
        const mapCtx = Taro.createMapContext('map');
        const bottomPadding = computeBottomPadding(points, viewportType, deps.tripStatus);
        const baseTopPadding = viewportType === 'order_detail' ? 60 : 24;
@@ -546,6 +548,9 @@
            }
        });
    };
    // 防抖包裹:状态切换瞬间多次连续调用只执行最后一次,避免 includePoints 动画相互打断
    const updateViewportByPayload = debounce(updateViewportByPayloadRaw, VIEWPORT_FIT_DEBOUNCE_MS);
    const toOrigin = () => {
        const mapCtx = Taro.createMapContext('map');
@@ -928,6 +933,7 @@
         if (deps.tripStatus === TripStatus.InService && viewportType === 'route') {
            tripStatus6ViewportLockedRef.current = true;
        }
        // updateViewportByPayload 已用 debounce 包裹:状态切换瞬间多次调用只执行最后一次
        updateViewportByPayload(viewportType, points);
        if ([TripStatus.TripFinished, TripStatus.PaymentSuccess].includes(deps.tripStatus) && viewportType === 'order_detail') {
            const hasOrderDetailRouteAfterEnter = orderDetailRouteUpdatedAfterEnterRef.current && deps.routePoints.length > 0;