auto_scroll_list_view.dart 2.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687
  1. import 'dart:async';
  2. import 'package:flutter/cupertino.dart';
  3. class AutoScrollListView extends StatefulWidget {
  4. final NullableIndexedWidgetBuilder itemBuilder;
  5. final int itemCount;
  6. final Axis scrollDirection;
  7. final EdgeInsetsGeometry? padding;
  8. final bool isAutoScrolling;
  9. const AutoScrollListView(
  10. {super.key,
  11. required this.itemBuilder,
  12. required this.itemCount,
  13. this.padding,
  14. this.isAutoScrolling = true,
  15. this.scrollDirection = Axis.horizontal});
  16. @override
  17. State<AutoScrollListView> createState() => _AutoScrollListViewState();
  18. }
  19. class _AutoScrollListViewState extends State<AutoScrollListView> {
  20. final ScrollController scrollController = ScrollController();
  21. Timer? _timer;
  22. bool _isUserScrolling = true;
  23. @override
  24. void initState() {
  25. super.initState();
  26. _isUserScrolling = widget.isAutoScrolling;
  27. _startAutoScroll();
  28. }
  29. @override
  30. void dispose() {
  31. super.dispose();
  32. scrollController.dispose();
  33. _timer?.cancel();
  34. }
  35. void _startAutoScroll() {
  36. _timer = Timer.periodic(Duration(milliseconds: 50), (timer) {
  37. if (_isUserScrolling) {
  38. scrollController.animateTo(
  39. scrollController.position.pixels + 1,
  40. duration: Duration(milliseconds: 50),
  41. curve: Curves.linear,
  42. );
  43. }
  44. });
  45. }
  46. void _onUserScroll() {
  47. if (!_isUserScrolling) {
  48. return;
  49. }
  50. _timer?.cancel();
  51. _timer = Timer(Duration(seconds: 1), () {
  52. setState(() {
  53. _isUserScrolling = widget.isAutoScrolling;
  54. });
  55. _startAutoScroll();
  56. });
  57. }
  58. @override
  59. Widget build(BuildContext context) {
  60. return GestureDetector(
  61. onPanDown: (_) => _onUserScroll(),
  62. onPanUpdate: (_) => _onUserScroll(),
  63. child: ListView.builder(
  64. padding: widget.padding,
  65. scrollDirection: widget.scrollDirection,
  66. itemCount: 1000000,
  67. itemBuilder: (context, index) {
  68. return widget.itemBuilder(context, index % widget.itemCount);
  69. },
  70. controller: scrollController),
  71. );
  72. }
  73. }