Zahra
Zahra

Reputation: 2658

flutter : how to groupBy two or more fields?

how can I use groupBy function which is in collection.dart to group items by two fields and return a model class with them not one field like int?

If I group by one field, It works fine and there is no problem:

 Map<int, List<FooterItem>> _getGroups(List<FooterItem> items) {
    return groupBy(items, (FooterItem i) {
      return  i.groupId;
    });
  }

But when I wan to return a model class from result ,groupBy is not grouping values . here I have a list of FooterItem which has It's group data and how can I use groupBy to group a List<FooterItem> by groupId and titleGroup and return FooterGroup not int :

class FooterItem {
  final int id;//item id
  final int groupId;
  final String title;//item title
  final String titleGroup;
...
}

Map<FooterGroup, List<FooterItem>> _getGroups(List<FooterItem> items) {
    return groupBy(items, (FooterItem i) {
      return FooterGroup(id: i.groupId, title: i.titleGroup);
    });
  }

Upvotes: 0

Views: 2053

Answers (2)

judehall
judehall

Reputation: 944

A quick way to achieve this:

groupBy(footers, (FooterItem f) {
  return '${f.groupId}+${f.titleGroup}';
});

Source: https://coflutter.com/dart-how-to-group-items-in-a-list/

Upvotes: 1

Zahra
Zahra

Reputation: 2658

I could solve problem by extending Equatable in the model class which I wanted to use as grouped values and overriding props :

import 'package:equatable/equatable.dart';
class FooterGroup extends Equatable{
  final int id;
  final String title;

  FooterGroup({
    @required this.id,
    @required this.title,
  });

  @override
  List<Object> get props => [id,title];
}

so duplicate values of Groups where not seen any more. so

Map<FooterGroup, List<FooterItem>> _getGroups(List<FooterItem> items) {
    return groupBy(items, (FooterItem i) {
      return FooterGroup(id: i.groupId, title: i.titleGroup);
    });
  }

works fine now.

Upvotes: 1

Related Questions