【问题标题】:Check for consecutive value in Map?检查地图中的连续值?
【发布时间】:2019-03-20 12:47:12
【问题描述】:

我正在创建一个聊天应用,如果用户连续发送多条消息,我不想一遍又一遍地显示用户头像。

用户消息存储在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');
}

【问题讨论】:

  • 如果您在Map 中使用迭代数字(0, 1, 2, ...)作为key,您可能希望将Map 替换为@ 987654332@。来源:MapList

标签: oop if-statement dart flutter boolean


【解决方案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-expression 是一个布尔值,你可以直接返回它。

【讨论】:

  • 感谢您的回复!我在尝试
  • 我尝试了,但是不行。我认为如果索引发生变化,这里可能存在问题,因为新值是在索引 0 处插入的。所以其他元素也发生了变化?你知道问题吗?
  • 究竟显示了什么,有什么问题?如果问题是新消息到达时列表项未更新,则可能是状态错误(可能在适当的时候调用 setState 以导致整个列表重新呈现?)。
  • 感谢您的回复!问题不仅仅是列表项没有更新。问题也是当更新头像显示在错误消息旁边时。然后,当添加新消息时,它会显示在其他消息旁边(有时是正确的)。然后当再次更新头像再次改变位置。但是这个问题只发生在前 2 条连续消息中。如果连续消息 3、4 没有发生 > 2 个连续消息问题...所以这个问题让我认为我检查索引的方式存在问题。因为我只检查[index + 1]
  • 是的,这应该会发生。但在我的应用程序中并没有实际发生。出于某种原因,新人也会获得头像(这不应该发生)。所以消息 1 和 2 得到头像。 (但不是消息 3、4...)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-09-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-06-23
  • 1970-01-01
  • 2017-03-11
相关资源
最近更新 更多