【问题标题】:List.contains not working with initialized ListList.contains 不适用于初始化列表
【发布时间】:2021-12-06 07:27:13
【问题描述】:
  • 我有一个固定列表,即在 init() 中初始化的 fixGuestList。轻按一下按钮,就会出现来宾列表。在点击客人时,所选客人将被添加到固定列表,即 fixGuestList。所以基本上我将一个列表中的元素添加到固定列表中。

  • 如果 fixGuestList 已经包含 guestList 中存在的元素。我想弹出一个已添加的snackBar() 来宾,否则将元素添加到修复列表。

  • 仅在列表未初始化时才有效。如果我保留列表并在init() 上,我将元素分配给固定列表。并尝试添加重复的客人,小吃店不会弹出它会将重复的客人添加到列表中。例如;我从来宾列表中添加了来宾“A”。然后我重新启动应用程序,然后再次添加来宾“A”,即使 fixedGuestList 包含“A”(我在打印语句“A”存在)中添加了“A”,如果我添加“A”并执行不重新启动并重试尝试添加 'A' 会弹出快餐栏。

  • Getx 用作 StateManagement,GetStorage 用于 Persisit 数据。两个列表的值都是映射。

代码如下:

  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'],
    );
  }
}

【问题讨论】:

    标签: flutter dart flutter-getx


    【解决方案1】:

    contains 使用operator equals (see here),通常称为==,来判断某事物是否相等。

    引用上面链接的文档:

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

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

    所以无论你有什么类,我建议你重写 == 运算符,以确保相同数据的两个不同实例仍然匹配。否则你会看到你现在看到的:只有实际相同的实例匹配。

    【讨论】:

    • 能否请您告诉我如何在现有代码中使用它? @nvoigt
    • @Shakun 我不能。您还没有发布应该比较的课程。你的班级是什么样的?如果你把代码贴出来,我可以试试。
    • 整个代码在一个类中,即GuestController。我错过了哪一门课? @nvoigt
    • 要比较的类。 guestListsomething 的列表。您需要更改 something 以使其具有可比性。我不知道它是什么样子的,你从来没有发布过。
    • 没有其他类。我想比较同一类中两个列表的元素。你所说的类是指我在其中调用函数addToLane() 的类吗? @nvoigt
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-03-29
    • 2017-05-15
    • 1970-01-01
    • 2012-01-12
    • 1970-01-01
    • 2023-04-10
    • 1970-01-01
    相关资源
    最近更新 更多