Сопоставить и сложить
Наиболее читаемый способ выполнить sh это - сделать это в двух частях. Во-первых, map
поверх вашего списка userData (он же user
) и извлеките unreadMsgs. Во-вторых, сложите все значения вместе, используя fold
.
Fold vs Reduce
используйте fold
вместо reduce
, чтобы предоставить значение по умолчанию на случай, если ваш List
когда-либо пусто.
Пример
Посмотреть на CodePen
final int unreadMsgCount =
user
.map((data) => data.unreadMsgs)
.fold(0, (acc, curr) => acc + curr);
return Scaffold(
body: Center(
child: Text(
'$unreadMsgCount',
style: Theme.of(context).textTheme.headline4,
),
),
);
fold
, вероятно, проще всего запутаться. Первый аргумент fold
- это initialValue
, а второй аргумент - функция обратного вызова, определяющая работу, которую вы хотите выполнить.
В нашем случае мы хотим добавить к нашим unreadMsgs. По соглашению вы увидите acc
или agg
в качестве первого аргумента в этом обратном вызове, acc
означает аккумулятор, а agg
означает агрегацию или агрегатор, но вы можете так же легко назвать его prev
для предыдущего; curr
обозначает ток.
map
берет на себя unreadMsgs
и fold
суммирует эти значения в определенную нами переменную unreadMsgCount
.
Используйте строковую интерполяцию, чтобы преобразовать int
в String
для вашего Text
виджета.