Flutter如何实现EasyRefresh顶部搜索框的联动
在Flutter中使用EasyRefresh组件时,如何实现顶部搜索框与下拉刷新的联动效果?具体需求是:当下拉刷新时,顶部的搜索框能跟随列表内容一起向下滑动,而不是固定在顶部不动。尝试过NestedScrollView和SliverAppBar,但容易出现滑动冲突或抖动问题。请问有没有更稳定的实现方案或示例代码?
2 回复
在 Flutter 中,可以通过 EasyRefresh 和 ScrollController 实现顶部搜索框与下拉刷新的联动效果,使搜索框随下拉操作显示或隐藏。以下是实现步骤:
1. 添加依赖
在 pubspec.yaml 中添加:
dependencies:
easy_refresh: ^3.0.0
2. 实现核心代码
import 'package:flutter/material.dart';
import 'package:easy_refresh/easy_refresh.dart';
class SearchWithRefresh extends StatefulWidget {
@override
_SearchWithRefreshState createState() => _SearchWithRefreshState();
}
class _SearchWithRefreshState extends State<SearchWithRefresh> {
final EasyRefreshController _refreshController = EasyRefreshController();
final ScrollController _scrollController = ScrollController();
bool _showSearchBar = true;
double _lastOffset = 0;
@override
void initState() {
super.initState();
_scrollController.addListener(_scrollListener);
}
void _scrollListener() {
final currentOffset = _scrollController.offset;
// 根据滚动方向显示/隐藏搜索框
if (currentOffset > _lastOffset && currentOffset > 50) {
setState(() => _showSearchBar = false); // 向下滚动隐藏
} else if (currentOffset < _lastOffset) {
setState(() => _showSearchBar = true); // 向上滚动显示
}
_lastOffset = currentOffset;
}
@override
Widget build(BuildContext context) {
return Scaffold(
body: EasyRefresh(
controller: _refreshController,
scrollController: _scrollController,
onRefresh: () async {
// 模拟刷新数据
await Future.delayed(Duration(seconds: 2));
_refreshController.finishRefresh();
},
child: CustomScrollView(
slivers: [
// 顶部搜索框
SliverAppBar(
pinned: true,
expandedHeight: 100,
flexibleSpace: _showSearchBar
? FlexibleSpaceBar(
background: Container(
color: Colors.white,
child: TextField(
decoration: InputDecoration(
hintText: '搜索...',
prefixIcon: Icon(Icons.search),
border: OutlineInputBorder(),
),
),
),
)
: null,
),
// 列表内容
SliverList(
delegate: SliverChildBuilderDelegate(
(context, index) => ListTile(title: Text('项目 $index')),
childCount: 20,
),
),
],
),
),
);
}
@override
void dispose() {
_scrollController.dispose();
_refreshController.dispose();
super.dispose();
}
}
关键点说明:
- 联动逻辑:通过
ScrollController监听滚动位置,根据偏移量变化显示/隐藏搜索框。 - 状态管理:使用
_showSearchBar布尔值控制搜索框的显隐。 - SliverAppBar:结合
FlexibleSpaceBar实现可折叠的搜索栏效果。 - EasyRefresh 配置:通过
scrollController属性关联滚动控制,确保下拉刷新与滚动监听共存。
效果:
- 用户向下滑动时,搜索框隐藏
- 向上滑动或返回顶部时,搜索框显示
- 下拉触发刷新功能正常
可根据实际需求调整滚动阈值(示例中为 50)和动画效果。


