Проверить последовательное значение на карте?

Я создаю приложение чата и не хочу отображать аватар пользователя снова и снова, если пользователь отправляет несколько сообщений подряд.

Пользовательские сообщения хранятся в Map, где самое новое сообщение имеет индекс 0. Чтобы проверить, отправлено ли сообщение в index тем же человеком, что и сообщение ранее, я использую следующий метод:

bool _sameUser () {
  if (index > 0 && map != null && map[index + 1] != null && map[index + 1]['fromUser’] == map[index][‘fromUser’]) {
    return true;
  } else {
    return false;
  }
}

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

Спасибо!

ОБНОВИТЬ:

Попробовав ответ @Marcel и протестировав больше, я обнаружил, что это может быть вызвано другой проблемой.

map[index + 1] != null неверно, даже если отправлено сообщение 2. Истинно только после отправки сообщения 3.

Я тестирую с условной функцией:

if (map[index + 1] != null) {
print('!=null');
}

Если вы используете повторяющиеся числа (0, 1, 2, ...) в качестве key в своем Map, вы, вероятно, захотите заменить Map на List. Источники: карта, Список

NiklasPor 22.03.2019 08:19
В PHP
В PHP
В большой кодовой базе с множеством различных компонентов классы, функции и константы могут иметь одинаковые имена. Это может привести к путанице и...
Принцип подстановки Лискова
Принцип подстановки Лискова
Принцип подстановки Лискова (LSP) - это принцип объектно-ориентированного программирования, который гласит, что объекты суперкласса должны иметь...
0
1
115
1

Ответы 1

Нет никаких причин, по которым ваш код не должен работать для индекса 0, за исключением того, что вы тестируете index > 0. Удалив это, он должен работать нормально:

bool _sameUser () {
  assert(index >= 0);
  assert(map != null);
  return map[index + 1] != null && map[index + 1]['fromUser'] == map[index]['fromUser'];
}

Поскольку я предполагал, что index никогда не должно быть меньше, чем 0, а map никогда не должно быть null, я переместил часть кода условия в операторы assert. Кроме того, поскольку ваше if-выражение является логическим, вы можете просто вернуть его напрямую.

Спасибо за ответ! я пытаюсь

FlutterFirebase 20.03.2019 17:37

Я пытаюсь, но это не работает. Я думаю, может быть, здесь есть проблема, если индекс изменяется, потому что новое значение вставляется в индекс 0. Значит, другие элементы также изменяются? Вы знаете проблему?

FlutterFirebase 21.03.2019 14:00

Что именно отображается и что в этом не так? Если проблема связана с тем, что элементы списка не обновляются при поступлении новых сообщений, это, вероятно, ошибка состояния (может быть, вызовите setState в нужное время, чтобы вызвать повторную визуализацию всего списка?).

Marcel 21.03.2019 14:52

Спасибо за ответ! Проблема заключается не только в том, что элемент списка не обновляется. Проблема также заключается в том, что аватар обновления отображается рядом с неправильным сообщением. Затем, когда добавляется новое сообщение, оно отображается рядом с другим сообщением (иногда правильным). Затем при повторном обновлении аватар снова меняет положение. Но эта проблема возникает только с первыми двумя последовательными сообщениями. Если > 2 последовательных сообщений, проблема не возникает с последовательными сообщениями 3, 4... Так что эта проблема заставляет меня думать, что проблема связана с тем, как я проверяю индекс. потому что я только проверка [index + 1]

FlutterFirebase 21.03.2019 15:13

Но это должно быть правильно... Если всего два сообщения, старое получает аватарку, потому что map[index + 1] == null вместо index == 1, а новое нет, потому что map[index].fromUser == map[index + 1].fromUser вместо index == 0.

Marcel 21.03.2019 16:45

Да, это должно быть то, что происходит. Но это не происходит в моем приложении. Почему-то новый тоже получает аватарку (такого быть не должно). Таким образом, сообщения 1 и 2 получают аватар. (Но не сообщения 3, 4...)

FlutterFirebase 21.03.2019 16:51

Хорошо, тогда функция, которую вы разместили, не является проблемой. Скорее проблема кроется где-то еще в вашем коде.

Marcel 21.03.2019 17:11

Я думаю, что проблема с функцией. У меня есть вопрос об обновлении с условным

FlutterFirebase 21.03.2019 17:23

Другие вопросы по теме