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),
),
);
}