【发布时间】:2020-11-27 23:52:32
【问题描述】:
我想实现ListView的自动滚动功能,但不知道如何正确控制。
我有 2 个按钮。一种会使 ListView 开始滚动到底部,另一种会使 ListView 停止滚动。
我知道我可以使用 ScollController 和 animateTo 自动滚动到底部,但我不知道如何停止。这是实现自动滚动功能的正确方法吗?如果是,那么我该如何停止滚动?
【问题讨论】:
我想实现ListView的自动滚动功能,但不知道如何正确控制。
我有 2 个按钮。一种会使 ListView 开始滚动到底部,另一种会使 ListView 停止滚动。
我知道我可以使用 ScollController 和 animateTo 自动滚动到底部,但我不知道如何停止。这是实现自动滚动功能的正确方法吗?如果是,那么我该如何停止滚动?
【问题讨论】:
在您的控制器中,您可以定义动画,包括要滚动的像素数以及从当前位置到列表中的目的地所需的时间。例如:
_controller.animateTo(pixelsToMove,
curve: Curves.linear, duration: Duration (milliseconds: 500));
如果要使用此控制器功能,可以添加ScrollNotification,并在滚动结束时不断调用它,直到按下停止按钮。
【讨论】:
您可以通过将animateTo 覆盖到当前位置来停止滚动,如下所示
_scrollController.animateTo(_scrollController.offset,
duration: Duration(milliseconds: 5000),
curve: Curves.fastOutSlowIn);
查看以下示例
import 'package:flutter/material.dart';
void main() {
runApp(new MyApp());
}
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return new MaterialApp(
title: 'Example',
home: new MyHomePage(),
);
}
}
class MyHomePage extends StatefulWidget {
@override
_MyHomePageState createState() => new _MyHomePageState();
}
class _MyHomePageState extends State<MyHomePage> {
ScrollController _scrollController = new ScrollController();
@override
Widget build(BuildContext context) {
return new Scaffold(
body: ListView.builder(
controller: _scrollController,
itemCount: 50,
itemBuilder: (_, index) =>
ListTile(title: Text('ListTile ' + index.toString())),
),
bottomSheet: Row(
mainAxisAlignment: MainAxisAlignment.spaceEvenly,
children: [
RaisedButton(
child: Text("Start Down"),
onPressed: () {
setState(() {
_scrollController.animateTo(
_scrollController.position.maxScrollExtent,
duration: Duration(milliseconds: 5000),
curve: Curves.fastOutSlowIn);
});
},
),
RaisedButton(
child: Text("Stop"),
onPressed: () {
setState(() {
_scrollController.animateTo(_scrollController.offset,
duration: Duration(milliseconds: 5000),
curve: Curves.fastOutSlowIn);
});
},
)
],
),
);
}
}
【讨论】: