Dart 扩展了 Map 以便于延迟加载

2024-04-08

我正在尝试将数据从服务器延迟加载到地图中。
出于这个原因,我想向 Map 添加功能,以便当键不存在时,会进行调用以获取值.

我尝试的是这样的:

class LazyMap extends Map {
  // use .length for now. When this works, go use xhr
  operator [](key) => LazyMap.putIfAbsent(key, () => key.length);
}

LazyMap test = new LazyMap();

main() {
  print(test.containsKey('hallo')); // false

  // I prefer to use this terse syntax and not have to use putIfAbsent
  // every time I need something from my map
  print(test['hello']); // 5

  print(test.containsKey('hallo')); // true
}

这会引发一个错误,指出“无法解析隐式超级调用的构造函数映射”,这对我来说很神秘。

这是我第一次尝试扩展任何东西,所以我可能会做一些愚蠢的事情。 任何关于做得更好的建议,或者可能告诉我我正在使用不好的做法,将不胜感激。

我研究过这个答案:如何在 Dart 中扩展列表 https://stackoverflow.com/questions/16247045,但这是关于扩展列表,而不是映射。我寻找过 MapBase 但找不到。
我研究过这个答案:我想将我自己的方法添加到一些 Dart 类中 https://stackoverflow.com/questions/12925019,但这似乎是一个非常古老的答案,没有真正的解决方案。

亲切的问候, 亨德里克·简


你应该看看的另一个答案如何在 Dart 中扩展列表? https://stackoverflow.com/a/18508061/634863;)在这个答案中我指出委托列表 http://google.github.io/quiver-dart/docs/quiver.collection/DelegatingList.html。旁边有委托地图 http://google.github.io/quiver-dart/docs/quiver.collection/DelegatingMap.html.

您可以使用委托地图 http://google.github.io/quiver-dart/docs/quiver.collection/DelegatingMap.html作为超类或作为 mixin 来做你想做的事:

import 'package:quiver/collection.dart';

class LazyMap extends DelegatingMap {
  final delegate = {};

  operator [](key) => putIfAbsent(key, () => key.length);
}

请注意,您将无法将此与xhr因为xhr是异步的。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Dart 扩展了 Map 以便于延迟加载 的相关文章