Flutter - 避免 ListView 重建

问题描述

当您根据 ListViewListView.builder认行为插入/删除/重新排序(或进行任何其他操作)ListView.separated 项时,它始终会重建整个小部件。

我怎样才能避免这种情况?它会带来数据丢失等不良后果。

解决方法

您可以通过设置 ListView.builder 属性来使用 ListView.separated,而不是使用 ListView.customfindChildIndexCallback

ListView.custom(
        key: Key('messageListView'),controller: _scrollController,reverse: true,childrenDelegate: SliverChildBuilderDelegate(
          (context,i) {
            return Container(key: ValueKey('message-${message.id}'));
          },childCount: _messages.length,findChildIndexCallback: (key) {
            final ValueKey<String> valueKey = key;
            return _messages
                .indexWhere((m) => 'message-${m.id}' == valueKey.value);
          },),);