hanxu317317 / city_pickers

flutter ios city_pickers
MIT License
374 stars 195 forks source link

不支持code码为0开头的数据源 #139

Open pengkr opened 2 years ago

pengkr commented 2 years ago

当数据源中的code值为0开头时,会匹配错误,比如如下数据源:

{
    "0031": "上海市", 
    "0053": "云南省"
}

{
  "0031": {
      "3100": {
          "name": "上海市"
      }
  }, 
  "0053": {
      "5301": {
          "name": "昆明"
      }, 
      "5302": {
          "name": "西双版纳"
      }
  }
}

查阅代码后,发现是这里对code值先转成了int,然后转成String

base.dart

Point _provinceTree = cityTree.initTree(int.parse(_province.code.toString()));

base_citys.dart

initTree(int provinceId) {
  String _cacheKey = provinceId.toString();

  // _provincesData的key是原始的String类型
  // provinceId.toString()是先转了int,然后再转的String,导致前面的00丢失
  String name = this._provincesData[provinceId.toString()]!;
  String letter = PinyinHelper.getFirstWordPinyin(name).substring(0, 1);
  var root =
      new Point(code: provinceId, letter: letter, child: [], name: name);
  tree = _buildTree(root, metaInfo[provinceId.toString()], metaInfo);
  _cache.set(_cacheKey, tree);
  return tree;
}

想了解下,这里先转成int类型,是考虑了什么情况吗?

自己尝试把Point类中的code改为String类型,移除转int类型的操作,能正常运行,不知道会不会存在什么隐患?如果没有问题,可以对此进行修复一下吗?

hanxu317317 commented 2 years ago

可以了解一下. 为什么没有使用标准的地区码. 而是使用031.032这种么?

至于为什么要int一下. 是在淘系的时候. 地区码都是 标准数字. 习惯性的初始化一下.

pengkr commented 2 years ago

第三方SDK那边提供的数据源,是0开头的

pengkr commented 2 years ago

可以对此问题修复一下吗?String才适合更多情况吧,没必要强制使用标准地址码

hanxu317317 commented 2 years ago

让我想想. 怎么小范围改动. 适配你这种情况

pengkr commented 2 years ago

好的,感谢

hanxu317317 commented 2 years ago

有一个非常lowb的办法. 在注入meta的时候, 为每一个id前加入"1",
如: 转化前

{
    "0031": "上海市", 
    "0053": "云南省"
}

转化后

{
    "10031": "上海市", 
    "10053": "云南省"
}

出来结果的时候. 把"1' 去掉

pengkr commented 2 years ago

这个最开始有想到,APP层还涉及到数据回显,改动就会比较多。 也考虑到在后端去修改数据源,但因为是第三方的数据源,就尽量没有去动这个数据。

在插件内部去进行id左边加1的操作,会不会更好一点~ 对使用者是无感的 或者直接去掉转int的操作吧~

hanxu317317 commented 2 years ago

本地看了一下. 改动还是比较大的. 端午前后修复过下. 看如何安全改造.

codertiany commented 2 years ago

选择上海,南京这些都会挂掉 出现异常。 _AssertionError ('package:flutter/src/rendering/object.dart': Failed assertion: line 2708 pos 12: '!_debugDisposed': is not true.)

pengkr commented 2 years ago

本地看了一下. 改动还是比较大的. 端午前后修复过下. 看如何安全改造.

hello,进展如何

hanxu317317 commented 2 years ago

看了一下. 改成成本略高. 不太敢动. 欢迎提PR~~解决

hanxu317317 commented 2 years ago

最后审视了一下. 还是觉得完成这个改造了. 使用int在中间做key有点傻.