微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

flutter LinkedHashMap 与 python 中的orderedDict 相比

如何解决flutter LinkedHashMap 与 python 中的orderedDict 相比

自去年秋天以来,我就是颤振宝贝。当我们使用 Flutter 类型时,它们通常提供像 toString() 这样的通用特性。其中之一是“.runtimeType”,但这种“获取 runtimeType方法似乎不适用于发布模式,而实际上在调试模式下运行良好。

假设我们有像 Map amIMap = {"key": "is key","value": "is value",}; 这样的法线贴图 通常我们认为这个变量的类型是'Map',但是调试模式下的print(amIMap.runtimeType);方法(看起来不像在发布模式下工作)打印的不是'Map'而是类似LinkedHashMap的东西,这可能因开发环境而略有不同,但 LinkedHashMap 的概念基本相同。

那么问题来了。在这链接 'https://api.flutter.dev/flutter/dart-collection/LinkedHashMap-class.html' 中,似乎上面情况的打印类型是 Dart 团队真正想要的东西,而且它看起来真的很像 python 中的 ordersDict。通过这个问题,我想确保 LinkedHashMap 的这个概念可以安全使用。我要说的是,我想知道键对的顺序及其对应的值是否安全地保持不变,就像 python 中的“orderedDict”一样,不管调试、配置文件、发布模式、dartpad 甚至平台等环境像 android、ios、macos、linux、window、web!

因为我在我的应用程序中看到 runtimeType 在发布模式下不能很好地工作,所以我担心在发布模式下,sdk 可能会忘记键值对的顺序,就像 runtimeType 方法一样。

我问这个问题的原因是我需要强制对的顺序与 IDEA 中的 dart 代码完全相同,以便我可以将它们转换为相同格式的 json 字符串,然后对 json 进行散列字符串,它们都具有完全相同的对顺序,使用加密包的 sha256 散列方法。 map 的顺序必须在它们被散列之前保持不变。让我害怕的是,颤振往往会因环境而异。此外,当我使用 firestore 插件时,我必须手动对 firestore 中的地图进行排序,因为它们的顺序与可以通过 firebase 控制台检查的顺序不同。这些问题似乎处于相似的背景下。因此,如果linkedHashMap即使在发布模式下也要保存我的地图对的顺序,无论Flutter 2.0的各种平台如何,我都需要bool值,就像python中的orderedDict一样。

希望这个领域的任何大师都能以完全确信的经验回答这个问题。如果我在这个问题中留下不清楚甚至错误的地方,我将非常感谢您的评论

在此先感谢您 [:

解决方法

首先,除了调试之外,您不应该将 .runtimeType 用于任何其他用途。如您所见,输出确实不是那么稳定,因此很少用于任何事情。如果您需要检查给定对象是否与给定 is 兼容,则应改用 class 运算符。

其次,Dart 中的 Map() 构造函数({} 语法与此相同)被记录为创建 LinkedHashMap 的实例。由于这是标准 SDK 和语言设计的一部分,因此不会更改。此外,此行为将在运行 Dart 的所有平台上保持稳定。

但如果您想确保始终使用 LinkedHashMap,您可以通过从 dart:collection 导入类来显式创建 LinkedHashMap 的实例。

LinkedHashMap 记录为:

key 的插入顺序会被记住,key 会按照它们插入 map 的顺序进行迭代。值按其相应键的顺序迭代。更改键的值,当键已经在映射中时,不会改变迭代顺序,但是删除键并再次添加它会使其在迭代顺序中排在最后。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。