flutter - 在 ListView 中拉动刷新而不拉动动画
问题描述
我在 RefreshIndicator 和 SmartRefresher 中使用了 ListView,但问题是当我拉下它时,它会为拉动设置动画。我不想显示拉动动画。我曾尝试使用 clampscrollphysics 来禁用拉动动画,但如果我使用它,刷新将不起作用。所以请让我知道如何进行拉动刷新,它会显示刷新指示器,也会刷新但不会显示带有列表视图的下拉动画
解决方案
将自定义物理课程应用到您的列表视图中。
ListView.builder(
physics: Custom2ScrollPhysics()
)
Custom2ScrollPhysics 类
class Custom2ScrollPhysics extends ScrollPhysics {
/// Creates scroll physics that prevent the scroll offset from exceeding the
/// bounds of the content..
const Custom2ScrollPhysics({ScrollPhysics parent}) : super(parent: parent);
@override
Custom2ScrollPhysics applyTo(ScrollPhysics ancestor) {
return Custom2ScrollPhysics(parent: buildParent(ancestor));
}
@override
double applyBoundaryConditions(ScrollMetrics position, double value) {
assert(() {
if (value == position.pixels) {
throw FlutterError('$runtimeType.applyBoundaryConditions() was called redundantly.\n'
'The proposed new position, $value, is exactly equal to the current position of the '
'given ${position.runtimeType}, ${position.pixels}.\n'
'The applyBoundaryConditions method should only be called when the value is '
'going to actually change the pixels, otherwise it is redundant.\n'
'The physics object in question was:\n'
' $this\n'
'The position object in question was:\n'
' $position\n');
}
return true;
}());
if (value < position.pixels && position.pixels <= position.minScrollExtent) // underscroll
return value - position.pixels;
if (position.maxScrollExtent <= position.pixels && position.pixels < value) // overscroll
return value - position.pixels;
if (value < position.minScrollExtent && position.minScrollExtent < position.pixels) // hit top edge
return value - position.minScrollExtent;
if (position.pixels < position.maxScrollExtent && position.maxScrollExtent < value) // hit bottom edge
return value - position.maxScrollExtent;
return 0.0;
}
@override
Simulation createBallisticSimulation(ScrollMetrics position, double velocity) {
final Tolerance tolerance = this.tolerance;
if (position.outOfRange) {
double end;
if (position.pixels > position.maxScrollExtent) end = position.maxScrollExtent;
if (position.pixels < position.minScrollExtent) end = position.minScrollExtent;
assert(end != null);
return ScrollSpringSimulation(spring, position.pixels, end, min(0.0, velocity), tolerance: tolerance);
}
if (velocity.abs() < tolerance.velocity) return null;
if (velocity > 0.0 && position.pixels >= position.maxScrollExtent) return null;
if (velocity < 0.0 && position.pixels <= position.minScrollExtent) return null;
return ClampingScrollSimulation(
position: position.pixels,
velocity: velocity,
tolerance: tolerance,
);
}
}
推荐阅读
- angular - 需要在材料设计选项卡中单击每个选项卡上调用不同的功能。?
- typescript - 在接口中的属性之间表达 XOR 的紧凑方式?
- android - 如何以编程方式将多个文件从 android 发送到服务器 node.js?
- asp.net - 使用数据创建重置密码链接并发送到电子邮件 ASP.NET Core Web-API
- angular - 自定义禁用指令不起作用
- django - 使用没有数据的 method.post
- rank - 在 MySQL 中使用 Rank 函数会导致错误
- intel-mkl - MKL 的英特尔文档:我在哪里可以获得这些库的函数列表?
- javascript - 设置状态后重新渲染状态
- reactjs - 将自定义字段导出到 csv。反应管理员