2

我正在尝试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

问题:为什么messagesinAnimatedList.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),
    ),
  );
}
4

0 回答 0