#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/