我正在尝试使用 RefreshIndicator,但如果不使用滚动小部件,我将无法使用它。我的目标是仅显示文本小部件并添加拉动刷新功能。
if (snapshot.data.isEmpty) {
return RefreshIndicator(
onRefresh: () async {
_init();
},
child: Center(
child: Text('No data'),
),
);
}
我已将
Text('No data')
小部件包装在 SingleChildScrollView 中,但它不起作用。我的解决方案现在如下,但看起来很丑。有更好的方法吗?
if (snapshot.data.isEmpty) {
return RefreshIndicator(
onRefresh: () async {
_init();
print('we scrolled');
},
child: Center(
child: ListView.builder(
itemCount: 1,
itemBuilder: (context, index) {
return Text('No data\nPull to Refresh');
},
),
),
);
}
将物理设置为始终可滚动
ListView.builder(
physics:AlwaysScrollableScrollPhysics(),
itemCount: 1,
itemBuilder: (context, index) {
return Text('No data\nPull to Refresh');
},
)
我创建了一个多功能的 SmartRefreshIndicator 小部件,可以与
一起使用可滚动和不可滚动的子部件。
它非常适合在各种 UI 元素中集成下拉刷新功能,例如 ListView、Column 或任何需要刷新功能的小部件。
class SmartRefreshIndicator extends StatelessWidget {
final Future<void> Function() onRefresh;
final Widget child;
final bool isChildScrollable;
const SmartRefreshIndicator({
super.key,
required this.onRefresh,
required this.child,
this.isChildScrollable = false,
});
@override
Widget build(context) {
return LayoutBuilder(
builder: (context, constraints) => RefreshIndicator(
onRefresh: onRefresh,
child: isChildScrollable
? child
: SingleChildScrollView(
physics: const AlwaysScrollableScrollPhysics(),
child: SizedBox(
height: constraints.maxHeight,
child: child,
),
),
),
);
}
}
您可以随意扩展和自定义它以满足您的特定需求!