auto_scroll_list_view.dart 2.0 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889
  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. });
  17. @override
  18. State<AutoScrollListView> createState() => _AutoScrollListViewState();
  19. }
  20. class _AutoScrollListViewState extends State<AutoScrollListView> {
  21. final ScrollController scrollController = ScrollController();
  22. Timer? _timer;
  23. bool _isUserScrolling = true;
  24. @override
  25. void initState() {
  26. super.initState();
  27. _isUserScrolling = widget.isAutoScrolling;
  28. _startAutoScroll();
  29. }
  30. @override
  31. void dispose() {
  32. super.dispose();
  33. scrollController.dispose();
  34. _timer?.cancel();
  35. }
  36. void _startAutoScroll() {
  37. _timer = Timer.periodic(Duration(milliseconds: 50), (timer) {
  38. if (_isUserScrolling) {
  39. scrollController.animateTo(
  40. scrollController.position.pixels + 1,
  41. duration: Duration(milliseconds: 50),
  42. curve: Curves.linear,
  43. );
  44. }
  45. });
  46. }
  47. void _onUserScroll() {
  48. if (!_isUserScrolling) {
  49. return;
  50. }
  51. _timer?.cancel();
  52. _timer = Timer(Duration(seconds: 1), () {
  53. setState(() {
  54. _isUserScrolling = widget.isAutoScrolling;
  55. });
  56. _startAutoScroll();
  57. });
  58. }
  59. @override
  60. Widget build(BuildContext context) {
  61. return GestureDetector(
  62. onPanDown: (_) => _onUserScroll(),
  63. onPanUpdate: (_) => _onUserScroll(),
  64. child: ListView.builder(
  65. padding: widget.padding,
  66. scrollDirection: widget.scrollDirection,
  67. itemCount: 1000000,
  68. itemBuilder: (context, index) {
  69. return widget.itemBuilder(context, index % widget.itemCount);
  70. },
  71. controller: scrollController,
  72. ),
  73. );
  74. }
  75. }