Flutter AnimatedList с BlocListener

Я пытаюсь получить AnimatedList работаю с моим текущим MessengerBloc который может принять MessengerEvent.pushed(Message) а также MessengerBloc.popped(Message). Когда состояние изменяется, он прослушивает и сравнивает предыдущее состояние с текущим состоянием, чтобы выяснить, какой индекс элемента необходимо добавить / удалить / переместить. До сих пор работает, поэтому я удалил этот код для краткости.

Проблема

Когда я добавляю MessengerEvent.pushed(Message) это последовательность операторов печати:

message was added

building messages

[Message()] // из print(messages) в _buildOverlay()

index0: [] // из print('index$index: $messages') в AnimatedList.itemBuilder

index0: [Message()] // из print('index$index: $messages') в AnimatedList.itemBuilder

Вопрос: Почему messages в AnimatedList.itemBuilder распечатывает emptyList, затем снова запускается с обновленным messages?

class MessageOverlay extends StatelessWidget {
  final GlobalKey<AnimatedListState> _animatedListKey = GlobalKey();

  Widget _buildOverlay(KtList<Message> messages) {
    print('building messages');
    print(messages);
    return AnimatedList(
      key: _animatedListKey,
      initialItemCount: messages.size,
      itemBuilder: (context, index, animation) {
        print('index$index: $messages');
        return const SizedBox.shrink();
      },
    );
  }

  @override
  Widget build(BuildContext context) {
    return BlocConsumer<MessengerBloc, MessengerState>(
      listener: (context, state) {
        // Message moved - Removed code for brevity
        if (messageMoved) {
          print('message was moved');
          _animatedListKey.currentState
              .removeItem(prevIndex, (context, animation) => null);
          _animatedListKey.currentState.insertItem(nextIndex);
        }
        // Message added - Removed code for brevity
        else if (messageAdded) {
          print('message was added');
          _animatedListKey.currentState.insertItem(nextIndex);
        }
        // Message removed - Removed code for brevity
        else if (messageRemoved) {
          print('message was removed');
          _animatedListKey.currentState
              .removeItem(prevIndex, (context, animation) => null);
        }
      },
      builder: (context, state) => _buildOverlay(state.messages),
    ),
  );
}

0 ответов

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