我正在尝试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
inAnimatedList.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),
),
);
}