You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Flutter关闭Dialog后ListView无法刷新的问题求助

解决Flutter筛选后ListView不刷新的问题

我仔细看了你的代码,问题核心在于筛选后没有重置数据状态,导致新的筛选结果被追加到旧数据后面,而且请求的不是筛选后的第一页数据,所以UI看起来毫无变化。下面是具体的修复步骤:

1. 筛选保存时重置数据状态

在_savetoSF方法中,调用getData()之前,必须先清空现有数据并重置页码,这样新的请求会从第一页开始获取筛选后的完整数据:

_savetoSF() async{
  SharedPreferences prefs = await SharedPreferences.getInstance();
  prefs.setString('order', filters);
  prefs.setString('sort', sort);
  prefs.setString('orderstring', _filters);
  prefs.setString('sortstring', _sort);
  Navigator.pop(context);
  // 重置数据和页码,确保请求第一页的筛选结果
  setState(() {
    _players.clear();
    _page = 1;
  });
  getData();
}

2. 调整getData方法的逻辑

原来的getData一直往_players里追加数据,这只适合下拉加载更多的场景。当是筛选后的新请求(页码为1),我们需要先清空列表再添加新数据,加载更多时才继续追加:

Future<Null> getData() async {
  isConnected().then((intenet) async{
    if (intenet != null && intenet) {
      var url = 'https://example.com/api';
      final responseData = await http.post(
          url,
          body: {'token':_token,'page': "$_page",'order': filters,'sort': sort},
          headers: { "Accept": "application/json" });
      if(responseData.statusCode == 200){
        final data = jsonDecode(responseData.body);
        setState(() {
          if (_page == 1) {
            // 第一页(筛选后)清空旧数据,只保留新筛选结果
            _players = [];
          }
          for(Map i in data['data']){
            _players.add(Player.fromJson(i));
          }
        });
      }
      _page++;
    }
  });
}

3. 修复initState的异步顺序问题

_getDatafromSF是异步方法,你原来在initState里直接调用getData(),会导致第一次请求时filters和sort还没从SharedPreferences读取完成,可能用的是默认值。改成等待_getDatafromSF完成后再调用getData():

@override
void initState() {
  super.initState();
  // 等SharedPreferences读取完成后再请求数据
  _getDatafromSF().then((_) {
    getData();
  });
  _scrollController.addListener(() {
    if (_scrollController.position.pixels == _scrollController.position.maxScrollExtent) {
      getData();
    }
  });
}

// 修改为Future类型,方便await/then调用
Future<void> _getDatafromSF() async{
  SharedPreferences prefs = await SharedPreferences.getInstance();
  String myorder = prefs.getString('order')?? "platinum";
  String mysort = prefs.getString('sort')?? "desc";
  String filterString = prefs.getString('orderstring')?? "Platinum";
  String sortString = prefs.getString('sortstring')?? "Descending";
  setState(() {
    filters = myorder;
    _filters = filterString;
    sort = mysort;
    _sort = sortString;
  });
}

4. 修复ListView.builder的逻辑错误

你当前的itemBuilder存在逻辑冲突:先判断i == _players.length - 1返回loadingView,后面又有if (i < _players.length)的判断,会导致索引越界或者显示异常。调整成正确的加载更多逻辑:

itemBuilder: (context, i){
  if (i < _players.length) {
    final nDataList = _players[i];
    return PlayerCard(nDataList);
  } else {
    // 只有当i等于_players.length时,才触发加载更多并显示loading
    getData();
    return loadingView();
  }
},
itemCount: _players.length + 1, // 加1是为了在列表底部显示loadingView

修改完成后,当你筛选保存后,列表会清空旧数据,重新请求筛选后的第一页数据,并且通过setState触发UI刷新,就能看到正确的筛选结果了。

内容的提问来源于stack exchange,提问作者hawkiq

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.06 17:53:12