DartのListにはcloneメソッドがないので、ディープコピーするには、
final test = [1, 2, 3];
final test2 = [...test];
と書く。
しかし、この書き方は、リスト内の要素がプリミティブな型(数値、文字列など)である場合にのみ機能する。
リストの要素が参照型(クラスとか)の場合は、要素もディープコピーする必要がある。
class Dog {
Dog({required this.name});
String name;
@override
String toString() {
return '{name=$name}';
}
// クローン用メソッドを用意する
Dog clone({String? name}) {
return Dog(name: name ?? this.name);
}
}
=====
// コピーの書き方
final dogList = <Dog>[Dog(name: 'Pochi'), Dog(name: 'Kuro'), Dog(name: 'Waaan')];
final copyList = [...dogList]; // ダメ
final copyList2 = dogList.map((item) => item.clone()).toList(); // OK
環境
Flutter 3.7.12 • channel stable • https://github.com/flutter/flutter.git
Framework • revision 4d9e56e694 (3 months ago) • 2023-04-17 21:47:46 -0400
Engine • revision 1a65d409c7
Tools • Dart 2.19.6 • DevTools 2.20.1
参考