我有一个名为 allAppointmentList 的函数,它使用 AppointmentProvider 类中的 GET 方法从服务器获取约会。 在我的 MyAppointments 类中,我初始化了 2 个名为 appointment 和 allAppointments 的列表,如下所示,
class _MyAppointmentState extends State<MyAppointment> {
bool isLoading = true;
List<Appointment> allAppointments=[];
List<Appointment> appointments = [];
在初始状态下,我将从 allAppointmentList 方法获得的数据分配给上面提到的 2 个列表。
@override
void initState() {
super.initState();
_loadAppointments();
}
_loadAppointments() async {
final AppointmentProvider appointmentProvider =
Provider.of<AppointmentProvider>(context, listen: false);
await appointmentProvider.getAllAppointments();
setState(() {
isLoading = false;
appointments = appointmentProvider.allAppointmentList;
allAppointments = appointmentProvider.allAppointmentList;
});
}
当我更改一个列表时,其他列表也会更改。例如, 如果我清除约会列表,allAppointments 列表也会被清除。如果我删除约会列表第二个索引中的元素,allAppointments 列表第二个索引中的元素也会被删除。
如何让这两个列表独立运行?
您的问题可能是您认为这会创建新列表:
appointments = appointmentProvider.allAppointmentList;
allAppointments = appointmentProvider.allAppointmentList;
我的猜测是
appointmentProvider.allAppointmentList
每次都返回相同的List
实例,这是一个问题,因为您只是将相同的List
对象分配给appointments
和allAppointments
。
我不确定您是否还想要列表中所有对象的副本,但是如果您只想拥有独立的列表,然后包含对相同对象的引用,最安全的方法就是:
appointments = appointmentProvider.allAppointmentList.toList();
allAppointments = appointmentProvider.allAppointmentList.toList();
这将创建新列表,然后包含来自
appointmentProvider.allAppointmentList
的相同对象。但是您可以删除/添加元素到这些列表中的每一个,而其他列表也不会发生这种变化。
appointments
和allAppointments
目前只是对appointmentProvider.allAppointmentList
的引用。您可以按如下方式创建新实例:
appointments = [...appointmentProvider.allAppointmentList];
allAppointments = [...appointmentProvider.allAppointmentList];
这使用列表文字
[]
结合扩展运算符 ...
创建具有相同元素的新列表。请注意,元素本身仍然是对其原始实例的引用,而不是深拷贝。
只是循环(appointmentProvider.allAppointmentList)
for (var i in appointmentProvider.allAppointmentList){
appointments.add(Appointment(<add all require param>) );
// don't use add(i)
allAppointments.add(Appointment(<add all require param>) );
}