多个列表共享相同的引用



我有一个名为allAppointmentList的函数使用appointment类中的get方法从服务器获取约会。在我的MyAppointments类我已经初始化了两个名为appointment和allAppointments的列表,如下所示,

class _MyAppointmentState extends State<MyAppointment> {
bool isLoading = true;
List<Appointment> allAppointments=[];
List<Appointment> appointments = [];

在init状态下,我已经将从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列表第二个索引中的元素也会被删除。

如何使这两个列表独立运行?

你的问题可能是你认为这会创建新的列表:

appointments = appointmentProvider.allAppointmentList;
allAppointments = appointmentProvider.allAppointmentList;

我的猜测是appointmentProvider.allAppointmentList每次返回相同的List实例,这是一个问题,因为你只是将相同的List对象分配给appointmentsallAppointments

我不确定你是否也想要列表中所有对象的副本,但如果你只是想拥有独立的列表,然后包含对相同对象的引用,最安全的做法是:

appointments = appointmentProvider.allAppointmentList.toList();
allAppointments = appointmentProvider.allAppointmentList.toList();

这将创建新的列表,然后包含来自appointmentProvider.allAppointmentList的相同对象。但是,您可以在这些列表中删除/添加元素,而不会对其他列表进行更改。

appointmentsallAppointments目前只是对appointmentProvider.allAppointmentList的引用。您可以创建新的实例,如下所示:

appointments = [...appointmentProvider.allAppointmentList];
allAppointments = [...appointmentProvider.allAppointmentList];

使用列表字面值[]和扩展操作符...来创建具有相同元素的新列表。注意,元素本身仍然是对其原始实例的引用,而不是深度副本。

just loop on (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>) );
}

最新更新