randomstudent
randomstudent

Reputation: 73

Remove User Defined Item from List

Hi I wanted to remove the Data from my List during onTap but I am unable to do so.

This is the code:

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

This is the 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}}';
  }
}

Any idea where went wrong? Thank you in advance.

Update List _selectedBusStop = [];

_selectedBusStop is empty List and upon LongPress it will add data into the List and upon onPress it will remove the data if the data already exist in the List.

Upvotes: 0

Views: 40

Answers (1)

Mohan Sai Manthri
Mohan Sai Manthri

Reputation: 3179

@randomstudent the issue is the instance, when you comaparing two values with different instance but even value is same, it returns false,

for example to understand simply.

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

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

Output: false

If you want to compare, compare using equatable

if you change like this

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

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

then for this

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

Output will be true.

To print you can override 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';
}

Output: The value of a is :3

Upvotes: 1

Related Questions