marquee_text.dart 1.9 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465
  1. import 'package:flutter/material.dart';
  2. import 'package:marquee/marquee.dart';
  3. typedef MarqueeBuilder = Marquee Function(
  4. BuildContext context, String text, TextStyle textStyle);
  5. typedef TextBuilder = Text Function(
  6. BuildContext context, String text, TextStyle textStyle);
  7. class MarqueeText extends StatelessWidget {
  8. final String text;
  9. final TextStyle textStyle;
  10. final double containerWidth;
  11. final TextBuilder textBuilder;
  12. final MarqueeBuilder marqueeBuilder;
  13. const MarqueeText({
  14. super.key,
  15. required this.marqueeBuilder,
  16. required this.textBuilder,
  17. required this.text,
  18. required this.textStyle,
  19. required this.containerWidth,
  20. });
  21. static MarqueeText marquee(
  22. {required String text,
  23. required TextStyle textStyle,
  24. required double containerWidth,
  25. double velocity = 18.0,
  26. double blankSpace = 20}) {
  27. return MarqueeText(
  28. text: text,
  29. textStyle: textStyle,
  30. containerWidth: containerWidth,
  31. textBuilder: (context, text, textStyle) {
  32. return Text(text, style: textStyle);
  33. },
  34. marqueeBuilder: (context, text, textStyle) {
  35. return Marquee(
  36. text: text,
  37. style: textStyle,
  38. blankSpace: blankSpace,
  39. pauseAfterRound: Duration(seconds: 2),
  40. velocity: velocity);
  41. },
  42. );
  43. }
  44. Size calculateTextSize(String text, TextStyle style) {
  45. final TextPainter textPainter = TextPainter(
  46. text: TextSpan(text: text, style: style),
  47. maxLines: 1,
  48. textDirection: TextDirection.ltr)
  49. ..layout(minWidth: 0, maxWidth: double.infinity);
  50. return textPainter.size;
  51. }
  52. @override
  53. Widget build(BuildContext context) {
  54. final textWidth = calculateTextSize(text, textStyle).width;
  55. return textWidth < containerWidth
  56. ? textBuilder(context, text, textStyle)
  57. : marqueeBuilder(context, text, textStyle);
  58. }
  59. }