我有一个地图,我从我的服务,我想把它复制到两个新的地图,而不被引用,每次我把一个值变成一个,价值也会改变到另一个。
这是我的服务config.UserGroups中的初始地图,我按如下方式复制它
SavedSettings.UserGroups = new Map.from(config.UserGroups);
UnSavedSettings.UserGroups = new Map.from(config.UserGroups);
这个映射是动态的,但它有字符串、对象
我们是否有一个简单的方法绕过参考;
发布于 2021-12-02 06:20:47
您所要求的是深度复制,您需要为您的数据结构实现自己,因为List
和Map
只包含对对象的引用。因此,当您复制List
或Map
时,您是在复制引用,而不是复制集合中的对象。
因此,正确的解决方案是创建一些逻辑,允许您复制UserGroup
对象并将它们放入新的列表中。
但是...如果你不害怕讨厌的解决方案.
带hacky解的截面
如果您真的想从Dart语言中获得深度复制(而不关心解决方案是否有点麻烦),理论上可以利用这样的想法:如果可能的话,我们可以将对象发送到被深度复制的对象。
因此,我们可以创建一个ReceivePort
并将我们的对象发送给我们自己。在这个例子中可以看到这样的一个例子:
class MyObject {
int value;
MyObject(this.value);
@override
String toString() => 'MyObject($value)';
}
Future<void> main() async {
final list1 = [MyObject(5)];
final list2 = await hackyDeepCopy(list1);
list2[0].value = 10;
print(list1); // [MyObject(5)]
print(list2); // [MyObject(10)]
}
Future<T> hackyDeepCopy<T>(T object) async =>
await (ReceivePort()..sendPort.send(object)).first as T;
当涉及到我们可以复制的数据时,这种“解决方案”/hack有一些限制:
消息的内容可以是:
中的任何一个)
在特殊情况下,当两个隔离器共享相同的代码并在相同的进程中运行(例如,通过Isolate.spawn创建的隔离)时,也可以发送对象实例(这些实例将在进程中复制)。这目前仅由Dart本机平台支持。
https://api.dart.dev/stable/2.14.4/dart-isolate/SendPort/send.html
我们在hackyDeepCopy
中使用的是“在特殊情况下,当两个隔离器共享相同的代码并在相同的进程中运行”部分,它允许我们深入复制定制的对象。
另一个限制是hackyDeepCopy
需要是异步的,如果您的代码还没有异步,这就有点烦人了。
最后,这只在本地平台上有效(所以不能像JavaScript那样运行Dart)。
https://stackoverflow.com/questions/70200647
复制相似问题