首页 > 解决方案 > ListView.builder 的索引在调用 setState 时不会重置。找到了一个奇怪的解决方法。有更好的解决方案吗?为什么会这样?

问题描述

我有这个 listview.builder ,它应该根据订单对象的状态显示来自 Order 对象数组的一些订单。它看起来有点像这样:

在此处输入图像描述

列表工作得很好,直到由于某种原因,当我向下滚动并且视口只能显示带有索引的顺序(listview builder 函数中的那个)5,然后按另一个类别,如“New”,调用 setState()并且整个事情都重建了,但是构建器的索引从 5 开始,而 listview.builder 没有构建从 0 到 4 的任何东西。我已经在构建器中打印了索引并发现了这个错误,但我仍然不明白为什么这正在发生。

这就是我的 listview.builder 代码的样子:

ListView.builder(
            controller: _scrollController,
            shrinkWrap: true,
            itemBuilder: (BuildContext context, int index) {
              print("INDEX: $index");

              return _showOrder(index);
            },
            itemCount: orders.length,
          ),

这是 _showOrder() 的代码:

Widget _showOrder(int i) {
    String _currOrderStatus = orders[i].orderStatus;

    /// _selectedOrderStatus is just a String which changes depending on the selected category of orders.
    /// e.g. "New" or "Past"
    return _currOrderStatus == _selectedOrderStatus
        ? ShowMyOrderWidget()
        : SizedBox(

            /// AND FOR SOME REALLY WEIRD REASON, THIS FIXES THE PROBLEM
            /// It works with any height, as long as it's not 0, but if I have a lot of them, then the 
            /// layout gets spaced out and messy. With such a low number, this is highly unlikely, but 
            /// still seems like a stupid fix.
            /// Why does this work? Why is this happening? Is there a better way to fix it?
            height: 0.000000001,
          );
  }

我只是调用屏幕顶部这些按钮setState()的功能。onPressed()

标签: flutterlistviewdebuggingindexingsetstate

解决方案


更改 ListView 内的项目不会重置滚动位置。由于您已经为 ListView 分配了 ScrollController,因此请在调用 setState() 之前尝试调用“jumpTo(0.0)”来重置它的滚动位置。

_scrollController.jumpTo(0.0);

推荐阅读