From 5fba8c4eda4c2ca149f3da975c12cc61cb5a22f6 Mon Sep 17 00:00:00 2001 From: laoyang Date: Thu, 5 Nov 2026 17:22:36 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E5=AF=BC=E8=88=AA=E7=9B=AE=E7=9A=84?= =?UTF-8?q?=E5=9C=B0=E5=89=8D=E9=9D=A2=E5=A4=9A=E5=87=BA=E9=97=AE=E5=8F=B7?= =?UTF-8?q?=20(#69)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 用户 2026-11-05:「导航的,点进去导航之后,为什么目的地地址前面有个问号」 根因:我上一轮拼的是 `lat,lng?地名` —— 那个 `?` 是照抄 `geo:` URI 的写法, 但这个字符串**不是 URI**,是交给 fbOpenNavigation() 的普通文本。 FbNav.parseGeoOf() 的动作: ① 正则抓 `数字,数字` 当坐标 ② clean = 把坐标从原文剪掉后剩下的文字,用作地名 传 `36.168977,120.375693?青岛北站` 剪掉坐标后剩 `?青岛北站` ⇒ 问号跟着进了高德 dname,目的地标题显示成「?青岛北站」。 改成「地名 + 空格 + lat,lng」: `青岛北站 36.168977,120.375693` 剪掉坐标后剩「青岛北站」,正是要显示的名字。 实测(复刻 parseGeoOf 跑): 旧 lat,lng?地名 → clean=[?青岛北站] ❌ 新 地名 lat,lng → clean=[青岛北站] ✅ 只有地名 → ok=false 走地理编码 ✅ 两处都改了: - FbEventSheet.navTargetOf()(#69 新增的) - FbDayEventPanel 行程卡片的 onClick(#67 里同一个错误) --- .../main/ets/components/FbDayEventPanel.ets | 6 +++++- .../src/main/ets/components/FbEventSheet.ets | 20 ++++++++++++++++++- 2 files changed, 24 insertions(+), 2 deletions(-) diff --git a/entry/src/main/ets/components/FbDayEventPanel.ets b/entry/src/main/ets/components/FbDayEventPanel.ets index 158eaa6..32d84b8 100644 --- a/entry/src/main/ets/components/FbDayEventPanel.ets +++ b/entry/src/main/ets/components/FbDayEventPanel.ets @@ -196,8 +196,12 @@ export struct FbDayEventPanel { .onClick((): void => { /* 有坐标就带坐标(同名地点不会搜错城市);没有就让 FbNav 自己地理编码 */ const hasPos: boolean = ev.toLng !== '' && ev.toLat !== ''; + /* ⚠️ 格式是「地名 + 空格 + lat,lng」,**不是** `lat,lng?地名`。 + 后者会把 `?` 留在地名里(`FbNav.parseGeoOf()` 剪掉坐标后 + 剩下的就是地名,`?` 会一起留下),于是高德的目的地标题 + 显示成「?青岛北站」。详见 `FbEventSheet.navTargetOf()` 的说明。 */ const target: string = hasPos - ? (ev.toLat + ',' + ev.toLng + '?' + ev.toPlace) + ? (ev.toPlace + ' ' + ev.toLat + ',' + ev.toLng) : ev.toPlace; fbOpenNavigation(getContext(this) as common.UIAbilityContext, target, ev.toPlace); diff --git a/entry/src/main/ets/components/FbEventSheet.ets b/entry/src/main/ets/components/FbEventSheet.ets index fd1f45f..7376ee9 100644 --- a/entry/src/main/ets/components/FbEventSheet.ets +++ b/entry/src/main/ets/components/FbEventSheet.ets @@ -255,7 +255,25 @@ export struct FbEventSheet { */ private navTargetOf(place: string, lng: string, lat: string): string { if (lng !== '' && lat !== '') { - return lat + ',' + lng + '?' + place; + /* 🔴 2026-11-05(用户:「点进去导航之后,为什么目的地地址前面有个问号」): + 原来拼的是 `lat,lng?地名` —— 那个 `?` 是我照抄 `geo:` URI 的写法, + 但这个字符串**不是 URI**,它是交给 `fbOpenNavigation()` 的普通文本。 + + `FbNav.parseGeoOf()` 的动作是: + ① 正则抓出 `数字,数字` 当坐标; + ② `clean` = **把坐标从原文里剪掉之后剩下的文字**,用作地名。 + ⇒ 传 `36.168977,120.375693?青岛北站` 时,剪掉坐标后剩下 `?青岛北站` + ⇒ 地名带着问号进了高德的 `dname`,目的地标题就成了「?青岛北站」。 + + ⇒ 改成**地名在前、空格、坐标在后**: + `青岛北站 36.168977,120.375693` + 剪掉坐标剩「青岛北站」,正好就是要显示的名字。 + + ⚠️ 顺序不能反过来:地名放后面虽然坐标照样能解析, + 但 `clean` 会剩「青岛北站」(如果地名在前)—— + 放后面则剩「青岛北站」也行;不过坐标在前时 + `clean` 前面会多一个空串拼接,最稳妥还是地名在前。 */ + return place + ' ' + lat + ',' + lng; } return place; }