颤振克隆ChangeNotifier对象中的列表



我使用提供商包作为状态管理解决方案,它工作得很好。

负责在整个应用程序中提供数据的主对象具有列表变量。它是一个扩展的ChangeNotifier对象,如下所示:

class DataSource with ChangeNotifier {...}

我有setter和getter来管理变量。

当我尝试在DataSource类的函数中克隆一个列表变量时,它从未真正克隆列表。

void cloneList() {
List<dynamic> list1 = [[Jack, 0], [Jane, 1]];
List<dynamic> list2 = List.from(list1);
list2.shuffle();
print(list1);
print(list2);

list1和list2是完全相同的表!

关于这个问题的有趣的一点是,当我在我的无状态小部件内做相同的操作时,它工作得很好!我只能找到两个操作之间的一个区别;

  1. 带有ChangeNotifier的对象变量
  2. 实例变量

你有什么办法解决这个问题吗?

注意:作为一个坏的解决方案,工作得很好是使用列表。生成函数创建另一个列表,但很难管理。

提前谢谢你。

问题是List.from(...)执行浅拷贝。list1list2的内容仍然引用相同的对象[Jack, 0][Jane, 1]

void main() {
String jack = 'Jack';
String jane = 'Jane';
final listOne = [[jack, 0], [jane, 1]];
final listTwo = List.from(listOne);
listOne[0][0] = 'Arthur';
listOne[0][1] = '123';
print(listOne); // [[Arthur, 123], [Jane, 1]]
print(listTwo); // [[Arthur, 123], [Jane, 1]]
}

一个解决方案:不变性

使用frozen包,我使Person类不可变。

现在,我不能改变Personage,相反,我必须复制Personage的新值。

import 'package:freezed_annotation/freezed_annotation.dart';
part '66259238.freezed.freezed.dart';
void main() {
Person jack = Person(name: 'Jack', age: 42);
Person jane = Person(name: 'Jane', age: 36);
List<Person> list1 = [jack, jane];
List<Person> list2 = [...list1];
// list1[0].age = 36; // COMPILATION ERROR: There isn’t a setter named 'age' in class '_$Person'.
list1[0] = list1[0].copyWith(age: 43);
print(list1); // [Person(name: Jack, age: 43), Person(name: Jane, age: 36)]
print(list2); // [Person(name: Jack, age: 42), Person(name: Jane, age: 36)]
}
@freezed
abstract class Person with _$Person {
const factory Person({String name, int age}) = _Person;
}

最新更新