Files
xinlong-shop-taro/.workbuddy/memory/2026-07-12.md
赵忠林 70ad1d030f feat(user): 使用微信原生 Picker 替换所在地选择弹层
- 删除 NutUI Address 相关导入、状态及地区数据转换逻辑
- 新增派生 regionValue 用于绑定微信原生 Picker 的 value
- 将 handleRegionChange 调整为处理微信 Picker 的事件
- 将所在地选择 UI 修改为微信原生 Picker 包裹的视图结构
- 地图定位失败使用弹窗提示,引导用户手动选择或重试
- 移除手动打开地区选择器的函数及 NutUI 组件
- 保留 RegionData 用于文本智能识别解析
- 编译通过,提升在无地图或无权限环境下的地区选择稳定性
2026-07-12 23:19:18 +08:00

3.7 KiB
Raw Permalink Blame History

2026-07-12

address-edit 地图选点「打开地图失败」修复

客户反馈部分手机无法通过选择地图填写地址/所在区,提示「打开地图失败,请重试」。 根因按概率①微信隐私授权未处理新版基础库强制最契合「部分手机」②chooseLocation 传 undefined 经纬度;③权限流程不完整;④失败无兜底。

已修复 src/pages/user/address-edit.tsx(四层):

  1. 调 chooseLocation 前 ensurePrivacyAuthorized()wx.getPrivacySetting/requirePrivacyAuthorize旧基础库无接口则放行
  2. 仅当 lat/lng 为有效数字时才传给 chooseLocation否则 chooseLocation({})
  3. ensureLocationPermission()getSetting 预检 + authorize 申请 + openSetting 引导并回读确认。
  4. 失败兜底:弹窗「手动选择」(打开所在地区选择器)/「再试一次」(chooseLocation({}))regionLocked 时不再误开选择器。

注意:项目本地 tsc --noEmit / npm run type-check 在本机因 Taro 类型入口缺失(@tarojs/taro 不在 @types会报错与本次改动无关taro build --type weapp 为准。 另:如仍偶发,需确认微信公众平台后台已配置《隐私保护指引》并发布。

跟进:放宽所在地区锁定,始终可手动选择

用户要求「万一地图不可用也能手动选所在地区、填地址提交」。分析发现该路径原本已通所在地区行→NutUI Address 选择器、详细地址 Input、save 不强制经纬度)。 唯一拦截点:regionLocked 在地图选点/编辑带坐标地址后置 true导致「所在地区」行与 handleRegionChange 被拦。 已放宽(仍保留 regionLocked 用于「识别」文本不覆盖地图地区):

  • openRegionPicker去掉 regionLocked 拦截,始终打开选择器。
  • handleRegionChange去掉拦截手动改后 setRegionLocked(false)。
  • chooseGeoLocation 兜底:去掉 regionLocked 分支,地图失败「手动选择」始终打开地区选择器。 编译验证:taro build --type weapp 通过。 (未做:手动改地区时不自动清除旧经纬度,避免误删数据;如需坐标随地区失效可再加。)

所在地区选择器NutUI Address → 微信原生 Picker mode='region'

参考 weiyu-taro 项目(同为 Taro 商城,src/pages/user/address-edit.tsx 用原生 <Picker mode='region'> 选省市区),将 xinlong 的所在地区从 NutUI <Address> 弹层改为微信原生 Picker与 weiyu-taro 对齐。

改动 src/pages/user/address-edit.tsx

  • 删除 import {Address} from '@nutui/nutui-react-taro'、状态 regionPickerVisible/regionOptions、以及把 regions-data.json 转 NutUI options 的 useEffect。
  • 新增派生 regionValue = [province, city, region].map(v=>String(v||''))3 元素数组,供原生 Picker value 绑定)。
  • handleRegionChange 由 NutUI (value:string[]) 改为原生 (e:any)e.detail.value,手动改后 setRegionLocked(false)
  • 「所在地区」行用 <Picker mode='region' value={regionValue} onChange={handleRegionChange}> 包裹。
  • 删除底部 <Address> 组件与 openRegionPicker 函数。
  • 地图失败兜底:原生 Picker 无法用代码调起,改为弹 modal 引导「重试」(chooseLocation({})) / 「手动填写」(toast 提示去下方手动选);未获定位权限时 toast 引导手动选。

优势:零依赖、零数据准备、系统级选择器永远可用(不联网/不依赖权限/不依赖组件库),是地图不可用最稳的兜底。 编译验证:taro build --type weapp 通过。 注RegionData 仍被 parseRegion/parseAddressText文本智能识别使用import 保留。