当文本在Flutter中溢出时,如何使Text小部件像选取框一样工作

Jas*_*ngh 3 user-interface text marquee dart flutter

我正在寻找一种在文本小部件上实现字幕样式的方法,以便当文本从屏幕溢出时它会自动开始滚动。有没有办法做到这一点。我尝试了所有装饰模式,但似乎无法在此处找到“字幕”选项。

Leo*_* Nx 9

我想出了这个小部件,我认为它可以满足您的需求:

class MarqueeWidget extends StatefulWidget {
  final Widget child;
  final Axis direction;
  final Duration animationDuration, backDuration, pauseDuration;

  MarqueeWidget({
    @required this.child,
    this.direction: Axis.horizontal,
    this.animationDuration: const Duration(milliseconds: 3000),
    this.backDuration: const Duration(milliseconds: 800),
    this.pauseDuration: const Duration(milliseconds: 800),
  });

  @override
  _MarqueeWidgetState createState() => _MarqueeWidgetState();
}

class _MarqueeWidgetState extends State<MarqueeWidget> {
  ScrollController scrollController = ScrollController();

  @override
  void initState() {
    scroll();
    super.initState();
  }

  @override
  Widget build(BuildContext context) {
    return SingleChildScrollView(
      child: widget.child,
      scrollDirection: widget.direction,
      controller: scrollController,
    );
  }

  void scroll() async {
    while (true) {
      await Future.delayed(widget.pauseDuration);
      await scrollController.animateTo(
          scrollController.position.maxScrollExtent,
          duration: widget.animationDuration,
          curve: Curves.easeIn);
      await Future.delayed(widget.pauseDuration);
      await scrollController.animateTo(0.0,
          duration: widget.backDuration, curve: Curves.easeOut);
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

它的功能应该非常明显。一个示例实现如下所示:

class FlutterMarqueeText extends StatefulWidget {
  @override
  _FlutterMarqueeTextState createState() => _FlutterMarqueeTextState();
}

class _FlutterMarqueeTextState extends State<FlutterMarqueeText> {
  @override
  Widget build(BuildContext context) {
    return Scaffold(
        appBar: AppBar(
          title: Text("Flutter Marquee Text"),
        ),
        body: Center(
          child: SizedBox(
              width: 200.0,
              child: MarqueeWidget(
                  direction: Axis.horizontal,
                  child: Text(
                      "This text is to long to be shown in just one line"))),
        ));
  }
}
Run Code Online (Sandbox Code Playgroud)