1

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

我怎样才能避免这种情况?它会带来不希望的结果,例如数据丢失。

4

1 回答 1

6

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

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);
          },
        ),
      );
于 2020-12-25T13:20:44.170 回答