marquee_text.dart 1.8 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364
  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. velocity: velocity);
  40. },
  41. );
  42. }
  43. Size calculateTextSize(String text, TextStyle style) {
  44. final TextPainter textPainter = TextPainter(
  45. text: TextSpan(text: text, style: style),
  46. maxLines: 1,
  47. textDirection: TextDirection.ltr)
  48. ..layout(minWidth: 0, maxWidth: double.infinity);
  49. return textPainter.size;
  50. }
  51. @override
  52. Widget build(BuildContext context) {
  53. final textWidth = calculateTextSize(text, textStyle).width;
  54. return textWidth < containerWidth
  55. ? textBuilder(context, text, textStyle)
  56. : marqueeBuilder(context, text, textStyle);
  57. }
  58. }