Я создаю приложение чата и не хочу отображать аватар пользователя снова и снова, если пользователь отправляет несколько сообщений подряд.
Пользовательские сообщения хранятся в 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, за исключением того, что вы тестируете 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-выражение является логическим, вы можете просто вернуть его напрямую.
Спасибо за ответ! я пытаюсь
Я пытаюсь, но это не работает. Я думаю, может быть, здесь есть проблема, если индекс изменяется, потому что новое значение вставляется в индекс 0. Значит, другие элементы также изменяются? Вы знаете проблему?
Что именно отображается и что в этом не так? Если проблема связана с тем, что элементы списка не обновляются при поступлении новых сообщений, это, вероятно, ошибка состояния (может быть, вызовите setState в нужное время, чтобы вызвать повторную визуализацию всего списка?).
Спасибо за ответ! Проблема заключается не только в том, что элемент списка не обновляется. Проблема также заключается в том, что аватар обновления отображается рядом с неправильным сообщением. Затем, когда добавляется новое сообщение, оно отображается рядом с другим сообщением (иногда правильным). Затем при повторном обновлении аватар снова меняет положение. Но эта проблема возникает только с первыми двумя последовательными сообщениями. Если > 2 последовательных сообщений, проблема не возникает с последовательными сообщениями 3, 4... Так что эта проблема заставляет меня думать, что проблема связана с тем, как я проверяю индекс. потому что я только проверка [index + 1]
Но это должно быть правильно... Если всего два сообщения, старое получает аватарку, потому что map[index + 1] == null вместо index == 1, а новое нет, потому что map[index].fromUser == map[index + 1].fromUser вместо index == 0.
Да, это должно быть то, что происходит. Но это не происходит в моем приложении. Почему-то новый тоже получает аватарку (такого быть не должно). Таким образом, сообщения 1 и 2 получают аватар. (Но не сообщения 3, 4...)
Хорошо, тогда функция, которую вы разместили, не является проблемой. Скорее проблема кроется где-то еще в вашем коде.
Я думаю, что проблема с функцией. У меня есть вопрос об обновлении с условным
Если вы используете повторяющиеся числа (0, 1, 2, ...) в качестве
keyв своемMap, вы, вероятно, захотите заменитьMapнаList. Источники: карта, Список