Flutter: AnimatedSwitcher внутри StreamBuilder - PullRequest
0 голосов
/ 10 июля 2020

Я пытаюсь реализовать AnimatedSwitcher в своем приложении для анимации чата, который использует firebase в качестве бэкэнда, я уже видел различные примеры, но когда я пытаюсь отправить новые сообщения в чате, анимация не работает, это мой код:

return StreamBuilder(
      stream: _chats,
      builder: (context, snapshot) {
        if (snapshot.hasData &&
            !snapshot.hasError &&
            snapshot.data.snapshot.value != null) {
          item = [];
          Map data = snapshot.data.snapshot.value;
          data.forEach((index, data) => item.add({
                "key": index,
                "message": data['message'],
                "sendBy": data['sendBy'],
                "time": data['time']
              }));
          item.sort((b, a) => a["time"].compareTo(b["time"]));
          return AnimatedSwitcher(
            duration: Duration(milliseconds: 500),
            child: ListView.builder(
                reverse: true,
                controller: _scrollController,
                itemCount: item.length,
                itemBuilder: (context, index) {
                  return MessageTile(
                      message: item[index]['message'],
                      sendByMe: widget.user.uid == item[index]['sendBy'],
                      time: item[index]['time']);
                }),
          );
        } else {
          return Container();
        }
      },
    );

1 Ответ

1 голос
/ 10 июля 2020

Если «новый» дочерний виджет имеет тот же тип и ключ, что и «старый» дочерний элемент, но с другими параметрами, тогда AnimatedSwitcher не будет выполнять переход между ними.

Попробуйте предоставление дочернему элементу (ListView) другого ключа каждый раз, когда StreamBuilder перестраивает

return AnimatedSwitcher(
  duration: Duration(milliseconds: 500),
  child: ListView.builder(
    key: ValueKey<int>(item.length), //perhaps a key based on the number of messages, so it will always be different
    reverse: true,
    controller: _scrollController,
    itemCount: item.length,
    itemBuilder: (context, index) {
      return MessageTile(
        message: item[index]['message'],
        sendByMe: widget.user.uid == item[index]['sendBy'],
        time: item[index]['time']);
  }),
);
...