Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

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

Open
pengkr opened this issue May 27, 2022 · 12 comments
Open

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

pengkr opened this issue May 27, 2022 · 12 comments

Comments

@pengkr
Copy link

pengkr commented May 27, 2022

当数据源中的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
Copy link
Owner

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

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

@pengkr
Copy link
Author

pengkr commented May 27, 2022

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

@pengkr
Copy link
Author

pengkr commented May 27, 2022

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

@hanxu317317
Copy link
Owner

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

@pengkr
Copy link
Author

pengkr commented May 27, 2022

好的,感谢

@hanxu317317
Copy link
Owner

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

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

转化后

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

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

@pengkr
Copy link
Author

pengkr commented May 27, 2022

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

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

@hanxu317317
Copy link
Owner

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

@codertiany
Copy link

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

@pengkr
Copy link
Author

pengkr commented Jun 16, 2022

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

hello,进展如何

@hanxu317317
Copy link
Owner

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

@hanxu317317
Copy link
Owner

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

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

3 participants