мне нужна сумма чисел из списка и отображать ее в текстовом виджете - PullRequest
0 голосов
/ 07 мая 2020

Это мой список, и мне нужна сумма непрочитанных сообщений в текстовом виджете. Я не могу понять, как я могу получить непрочитанные сообщения из этого списка и добавить их. кто-нибудь может помочь, как я могу сделать?

List<UsersData> user = [

  UsersData(
    name: 'Zack Alex',
    msg: 'Im on my way.',
    status: '3 hours ago',
    dp: 'assets/Zack.jpg',
    seenMsgs: false,
    unreadMsgs: 12,
  ),

  UsersData(
    name: 'Ali sho',
    msg: 'Send an attachemnt',
    status: 'false',
    dp: 'assets/Ali.jpg',
    seenMsgs: false,
    unreadMsgs: 3
  ),

  UsersData(
    name: 'Marie',
    msg: 'Gud Morning',
    status: '23 seconds ago',
    dp: 'assets/Marie.jpg',
    seenMsgs: true,
    unreadMsgs: 6,
  ),
];

Ответы [ 3 ]

2 голосов
/ 07 мая 2020

Сопоставить и сложить

Наиболее читаемый способ выполнить 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 виджета.

0 голосов
/ 07 мая 2020

Попробуйте следующее: работает нормально

class MyHomePage extends StatelessWidget {

  List<UsersData> user = [
    UsersData(
      name: 'Zack Alex',
      msg: 'Im on my way.',
      status: '3 hours ago',
      dp: 'assets/Zack.jpg',
      seenMsgs: false,
      unreadMsgs: 12,
    ),
    UsersData(
        name: 'Ali sho',
        msg: 'Send an attachemnt',
        status: 'false',
        dp: 'assets/Ali.jpg',
        seenMsgs: false,
        unreadMsgs: 3),
    UsersData(
      name: 'Marie',
      msg: 'Gud Morning',
      status: '23 seconds ago',
      dp: 'assets/Marie.jpg',
      seenMsgs: true,
      unreadMsgs: 6,
    ),
  ];

  // variable to hold sum of unread messages
  int sumOfUnreadMsgs = 0;

  @override
  Widget build(BuildContext context) {

    // use a for loop to loop through your list
    for (var person in user){
      // add all the messages here
      sumOfUnreadMsgs += person.unreadMsgs ;
    }

    return Scaffold(
      body: Center(
       // display sum of unread messages here
        child: Text('Sum of unread message is $sumOfUnreadMsgs'),
      ),
    );
  }
}

ВЫХОД

enter image description here

0 голосов
/ 07 мая 2020

Здесь вы можете использовать перегрузку оператора. Наверное, это не лучший способ, но один из возможных.

class Item {
  Item({this.id, this.msg});
  String id;
  int msg;

  Item operator +(Item other) {
    return Item(id: "", msg: (this.msg + other.msg));
  }
}

void main() {
  List<Item> data = [
    new Item(id: "A1", msg: 100),
    new Item(id: "A2", msg: 200),
    new Item(id: "A2", msg: 350)
  ];
  print(data.reduce((curr, next) => curr + next).msg);
}
...