首页 > 解决方案 > 从列表中删除用户定义的项目

问题描述

嗨,我想从我的List过程中删除数据,onTap但我无法这样做。

这是代码:

  Widget buildUser(BuildContext context, AsyncSnapshot<QuerySnapshot> snapshot){
    return ListView.builder(
      itemCount: snapshot.data.documents.length,
      itemBuilder: (context, index){
        DocumentSnapshot user = snapshot.data.documents[index];
        final style = _selectedBusStop.contains(ListClass(user.data['BusstopName'], user.data['location'].latitude.toString(), user.data['location'].longitude.toString()))
        ? TextStyle(
          fontSize: 18,
          color: Colors.blueAccent,
          fontWeight: FontWeight.bold,
        ): TextStyle(fontSize: 18);
        return ListTile(
          leading: CircleAvatar(
            backgroundImage: NetworkImage(
                user.data['image']
            ),
          ),
          title: Text(user.data['BusstopName'], style: style),
          subtitle: Text('Operating Hour: ' + user.data['OperatingHour'], style: style),
          trailing:
          _selectedBusStop.contains((ListClass(user.data['BusstopName'], user.data['location'].latitude.toString(), user.data['location'].longitude.toString()))) ? Icon(Icons.check, color: Colors.blueAccent, size: 26) : null,
          onTap: (){
            if(_selectedBusStop.contains(ListClass(user.data['BusstopName'], user.data['location'].latitude.toString(), user.data['location'].longitude.toString()))){
              setState(() {
                _selectedBusStop.removeWhere((val) => val == ListClass(user.data['BusstopName'], user.data['location'].latitude.toString(), user.data['location'].longitude.toString()));
                print (_selectedBusStop);
              });
            }
          },
          onLongPress: (){
              setState(() {
                _selectedBusStop.add(ListClass(user.data['BusstopName'], user.data['location'].latitude.toString(), user.data['location'].longitude.toString()));
                print(_selectedBusStop);
              });
          }
        );
      },
    );
  }

这是Class

class ListClass{
  String Bname;
  String Blat;
  String Blng;

  ListClass(this.Bname, this.Blat, this.Blng);

  @override
  String toString(){
    return '{${this.Bname}, ${this.Blat}, ${this.Blng}}';
  }
}

知道哪里出了问题吗?先感谢您。

更新 List _selectedBusStop = [];

_selectedBusStop是空List的,LongPress它会将数据添加到 中ListonPress如果数据已经存在于 中,它将删除数据List

标签: listfluttergoogle-cloud-firestore

解决方案


@randomstudent 问题是实例,当您将两个值与不同的实例进行比较但即使值相同时,它也会返回 false,

例如简单地理解。

void main() {
  final a = IntTestWrapper(3);
  final b = IntTestWrapper(3);
  print(a==b);
}

class IntTestWrapper {
  IntTestWrapper(this.a);
  final int a;
}

输出:假

如果要比较,请使用 equatable 进行比较

如果你这样改变

class IntTestWrapper extends Equatable {
  IntTestWrapper(this.a);
  final int a;

  @override
  List<Object> get props => [a];
}

那么为此

void main() {
  final a = IntTestWrapper(3);
  final b = IntTestWrapper(3);
  print(a==b);
}

输出为真。

要打印,您可以覆盖 toString

void main() {
  final a = IntTestWrapper(3);
  final b = IntTestWrapper(3);
  print(a);
}

class IntTestWrapper extends Equatable {
  IntTestWrapper(this.a);
  final int a;

  @override
  List<Object> get props => [a];

  @override
  String toString() => 'The value of a is :$a';
}

输出:The value of a is :3


推荐阅读