多个列表共享同一引用

Multiple lists share same reference

提问人:Kavishka Rajapakshe 提问时间:6/29/2022 更新时间:4/11/2023 访问量:443

问:

我得到了一个名为 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 列表的第二个索引中的元素也会被删除。

我怎样才能使这两个列表独立运行?

list flutter dart pass-by-reference statefulwidget

评论


答:

2赞 julemand101 6/29/2022 #1

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

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

我的猜测是每次都返回相同的实例,这是一个问题,因为您只是将相同的对象分配给两者。appointmentProvider.allAppointmentListListListappointmentsallAppointments

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

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

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

评论

1赞 julemand101 6/29/2022
还应该说 dumazy 的语法也可以工作并且做同样的事情。我个人更喜欢打电话到这里,以确保即使是新开发人员也了解这里发生的事情(因为我懒得解释什么是手段)。:)toList()[]...
1赞 dumazy 6/29/2022 #2

appointments并且目前只是对 的引用。您可以按如下方式创建新实例:allAppointmentsappointmentProvider.allAppointmentList

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

这将列表文本与 spread 运算符结合使用,以创建具有相同元素的新列表。请注意,元素本身仍然是对其原始实例的引用,而不是深度副本。[]...

0赞 Hassan Hallak 4/11/2023 #3

只是循环 (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>) );
}