flutter - 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()
解决方案
更改 ListView 内的项目不会重置滚动位置。由于您已经为 ListView 分配了 ScrollController,因此请在调用 setState() 之前尝试调用“jumpTo(0.0)”来重置它的滚动位置。
_scrollController.jumpTo(0.0);
推荐阅读
- excel - 基于多个条件的查找值
- apache-spark - Spark SQL - how to add two column value
- ios - UISlider 的 minView 超出了它的边界和拇指的中心
- jquery - Change css of div when ajax return success
- laravel - 在表单 datalist 中显示列表用户名并在表中发送 user_id
- sql - 如何从 ddl 生成表 - SQL Data Modeler 到 SQL Developer
- reactjs - React Js + Laravel 路由到 web 或 api?
- sockets - C:服务器/客户端套接字程序 - 客户端错误连接
- excel - Excel Formula - Lookup , Index Match Sumifs combination to find the first occurence
- javascript - 销毁和对象,客户端