列表.contains不能与初始化的List一起工作


  • 我有一个固定的列表,即fixGuestList正在init()中初始化。点击按钮,就会出现宾客列表。在点击客人时,所选的客人将被添加到固定列表中,即fixGuestList。所以基本上我是从一个列表中添加元素到固定列表。

  • 如果fixGuestList中已经包含该元素。我想弹出一个snackBar()客人已经添加了,否则添加元素来修复列表。

  • 仅在列表未初始化时工作。如果我持久化列表,在init()上,我将元素赋值给固定列表。试着添加重复的客人,小吃条不会弹出它会将重复的客人添加到列表中。如;我在宾客名单上加了客人A。然后我重新启动应用程序,然后再次添加客人'A',客人'A'被添加,即使fixedGuestList包含'A'(我检查了它在打印语句'A'存在)如果我添加'A',不重新启动并再次尝试添加'A',零食栏弹出。

  • Getx被用作statmanagement, GetStorage用于持久化数据。两个list的值都是映射

代码如下:

class GuestController extends GetxController {
final _userDataController = Get.find<UserDataController>();

List fixGuestList = List.filled(3, null, growable: false);
List? guestList = _userDataController.userDataModel.value.totalGuest! // This list is filled via API
// returns and empty index for fixGuestList
int _returnIndex() {
if (fixGuestList[0] == null) {
return 0;
} else if (fixGuestList[1] == null) {
return 1;
} else if (fixGuestList[2] == null) {
return 2;
}
return 3;
}
// Add function
void addToLane({required int index, required BuildContext context}) {
if (fixGuestList.contains(guestList![index])) {
ScaffoldMessenger.of(context).showSnackBar(_snackBar);
} else {
fixGuestList[_returnIndex()] = guestList![index];
storageBox.write('FixGuestList', fixGuestList);
}
update();
}
//
void onInitAssign() async {
final _boxValue = storageBox.read('FixGuestList');
if (_boxValue == null) {
List fixGuestList = List.filled(3, null, growable: false);
} else {
fixGuestList = _boxValue;
}
update();
}
// OnInit Function
@override
void onInit() {
onInitAssign();
super.onInit();
}
}

API类:

class FirbaseAPI extends GetxController {



@override
void onInit() {
userDataModel.bindStream(stream());
super.onInit();
}

// Stream User Model
Rx<UserDataModel> userDataModel = UserDataModel().obs;
// Stream
Stream<UserDataModel> stream() {
return FirebaseFirestore.instance
.collection('users')
.doc('userA')
.snapshots()
.map((ds) {
var mapData = ds.data();
UserDataModel extractedModel = UserDataModel.fromMap(mapData);
return extractedModel;
});
}
}

模型类:

class UserDataModel {
String? clubName;
List? totalGuest;
UserDataModel({
this.clubName,
this.totalGuest,
});
factory UserDataModel.fromMap(dynamic fieldData) {
return UserDataModel(
totalGuest: fieldData['totalGuest'],
);
}
}

contains使用operator equals(见这里),通常称为==,来确定某项是否相等。

引用上面链接的文档:

所有对象的默认行为是返回true当且仅当thisother是同一对象.

重写此方法以在类上指定不同的相等关系。

因此,无论您在那里有什么类,我建议您重写==操作符,以确保相同数据的两个不同实例仍然匹配。否则,您将看到现在所看到的:只有实际相同的实例匹配。

最新更新