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

Flutter中如何为SearchPage delegate实现下拉刷新功能

SearchPage下拉刷新实现方案

你使用的SearchPage组件本身没有内置下拉刷新能力,核心实现思路是给搜索建议页、搜索结果页的可滚动容器外层包裹RefreshIndicator组件,搭配状态层的数据源更新逻辑即可实现需求,具体实现步骤如下:

1. 先封装数据源拉取逻辑

把原来固定的nasabahList放到对应页面的State中管理,单独写数据拉取方法,供刷新时调用:

// 以下代码写在SearchPage所属页面的State类中
List<Nasabah> nasabahList = [];

// 拉取最新客户数据的方法,替换成你自己的接口/本地查询逻辑即可
Future<void> _refreshNasabahData() async {
  final latestList = await requestNasabahListFromApi(); // 替换成你的实际数据获取逻辑
  setState(() {
    nasabahList = latestList;
  });
}

@override
void initState() {
  super.initState();
  // 页面初始化时先加载一次数据
  _refreshNasabahData();
}

2. 改造SearchPage配置,包裹刷新组件

修改你原来的showSearch相关代码,给搜索建议、搜索结果的可滚动组件外层套上RefreshIndicator,注意必须给可滚动组件设置AlwaysScrollableScrollPhysics,否则列表长度不足屏幕高度时无法触发下拉手势:

floatingActionButton: FloatingActionButton(
  tooltip: 'Search people',
  onPressed: () => showSearch(
    context: context,
    delegate: SearchPage<Nasabah>(
      onQueryUpdate: (s) => print(s),
      items: nasabahList,
      searchLabel: 'Cari Nasabah',
      // 建议页包裹下拉刷新
      suggestion: RefreshIndicator(
        onRefresh: _refreshNasabahData,
        child: ListView(
          physics: const AlwaysScrollableScrollPhysics(),
          children: const [
            Center(
              child: Padding(
                padding: EdgeInsets.all(16),
                child: Text('Pencarian berdasarkan nama,alamat,ktp'),
              ),
            )
          ],
        ),
      ),
      failure: Center(
        child: Text('Data tidak ditemukan'),
      ),
      filter: (nasabah) => [
        nasabah.nama_debitur,
        nasabah.alamat,
        nasabah.no_ktp.toString(),
      ],
      // 自定义搜索结果列表,包裹下拉刷新
      builder: (context, filteredItems) {
        return RefreshIndicator(
          onRefresh: _refreshNasabahData,
          child: ListView.builder(
            physics: const AlwaysScrollableScrollPhysics(),
            itemCount: filteredItems.length,
            itemBuilder: (context, index) {
              final currentNasabah = filteredItems[index];
              // 替换成你自己的列表项UI
              return ListTile(
                title: Text(currentNasabah.nama_debitur),
                subtitle: Text(currentNasabah.alamat),
                trailing: Text(currentNasabah.no_ktp.toString()),
              );
            },
          ),
        );
      },
    ),
  ),
  child: const Icon(Icons.search),
)

关键注意点

  • 不需要额外处理搜索关键词的重新过滤逻辑:_refreshNasabahData更新nasabahList触发setState后,SearchPage会自动用当前输入框的搜索词对新数据做过滤,直接渲染匹配的结果。
  • 如果你不需要在搜索建议页支持下拉刷新,直接把suggestion参数里的RefreshIndicator去掉,改回原来的Center组件即可。
  • 如果你当前使用的SearchPage版本没有builder参数,升级到最新稳定版即可使用,该参数在2.0及以上版本均已支持。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.29 18:14:51