marquee.dart 1.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566
  1. import 'dart:async';
  2. import 'package:flutter/material.dart';
  3. class Marquee extends StatefulWidget {
  4. Widget child;
  5. double offset;
  6. Marquee({Key? key, required this.child, required this.offset})
  7. : super(key: key);
  8. @override
  9. State<Marquee> createState() => _MarqueeState();
  10. }
  11. class _MarqueeState extends State<Marquee> {
  12. late ScrollController controller;
  13. late Timer timer;
  14. double stepOffset = 50.0;
  15. Duration duration = const Duration(seconds: 5);
  16. // @override
  17. // void initState() {
  18. // // TODO: implement initState
  19. // super.initState();
  20. // controller = ScrollController(initialScrollOffset: widget.offset);
  21. // timer = Timer.periodic(const Duration(milliseconds: 100), (timer) {
  22. // double newOffset = controller.offset + stepOffset;
  23. // if (newOffset != widget.offset) {
  24. // widget.offset = newOffset;
  25. // controller.animateTo(widget.offset,
  26. // duration: duration, curve: Curves.linear);
  27. // }
  28. // });
  29. // }
  30. @override
  31. void initState() {
  32. // TODO: implement initState
  33. super.initState();
  34. controller = ScrollController(initialScrollOffset: widget.offset);
  35. double i = 0.5;
  36. timer = Timer.periodic(const Duration(milliseconds: 50), (timer) {
  37. i=i+0.5;
  38. controller.jumpTo(widget.offset + i);
  39. });
  40. }
  41. @override
  42. void dispose() {
  43. // TODO: implement dispose
  44. timer.cancel();
  45. controller.dispose();
  46. super.dispose();
  47. }
  48. @override
  49. Widget build(BuildContext context) {
  50. return ListView.builder(
  51. scrollDirection: Axis.horizontal,
  52. physics: const NeverScrollableScrollPhysics(),
  53. controller: controller,
  54. itemBuilder: (context, index) {
  55. return widget.child;
  56. });
  57. }
  58. }