флаттер : как сгруппировать два или более полей?

#flutter

Вопрос:

как я могу использовать groupBy функцию, которая используется collection.dart для группировки элементов по двум полям и возврата класса модели с ними, а не с одним полем, как int ?

Если я группируюсь по одному полю, это работает нормально, и проблем нет:

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

Но когда я хочу вернуть класс модели из результата , groupBy это не группировка значений .
здесь у меня есть список FooterItem , в котором есть данные группы, и как я могу использовать groupBy для группировки a List<FooterItem> по groupId и titleGroup и возврата группы нижнего колонтитула не 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);
    });
  }
 

Комментарии:

1. @pskink спасибо за идею с хэш-кодом. Я мог бы решить проблему, расширив Equatble , что упрощает сравнение равенства

Ответ №1:

Я мог бы решить проблему, расширив Equatable класс модели, который я хотел использовать в качестве сгруппированных значений и переопределив реквизиты :

 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];
}
 

так что дублируйте значения групп, где их больше не видно.

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

теперь работает нормально.

Комментарии:

1. да, Equatable это хороший вспомогательный класс

Ответ №2:

Быстрый способ достичь этого:

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

Источник: https://coflutter.com/dart-how-to-group-items-in-a-list/