我有一張從我??的服務中獲得的地圖,我想將它復制到 2 個新地圖中而不被參考,每次我將一個值更改為一個時,值也更改為另一個。
這是來自我的服務 config.UserGroups 的初始地圖,我像這樣復制它
SavedSettings.UserGroups = new Map.from(config.UserGroups);
UnSavedSettings.UserGroups = new Map.from(config.UserGroups);
這個地圖是動態的,但它有字串,物件
我們是否有一種簡單的方法可以繞過參考?
uj5u.com熱心網友回復:
你所要求的是所謂深度復制,是需要實作自己的,因為你的資料結構的東西List,并Map只包含物件的參考。因此,當您復制Listor 時Map,您復制的是參考而不是集合內的物件。
因此,正確的解決方案是制定一些邏輯,允許您制作UserGroup物件的副本并將它們放入新串列中。
但是......如果你不害怕hacky解決方案......
帶有hacky解決方案的部分
如果你真的想有辦法從 Dart 語言中獲得深層復制(并且不關心解決方案是否有點 hacky),理論上可以通過利用我們可以將物件發送到深層隔離的想法如果可能,復制。
所以我們可以創建一個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 Native 平臺支持。
https://api.dart.dev/stable/2.14.4/dart-isolate/SendPort/send.html
它是“在兩個隔離共享相同代碼并在同一行程中運行的特殊情況下”部分,我們使用hackyDeepCopy它允許我們深度復制自定義物件。
另一個限制是hackyDeepCopy需要異步,如果您的代碼尚未異步,這有點煩人。
最后,這僅適用于本機平臺(因此沒有 Dart-running-as JavaScript 的東西)。
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/375723.html
