代码之家  ›  专栏  ›  技术社区  ›  Jaswant Singh

当文本在Flutter中溢出时,如何使文本小部件像天棚一样工作

  •  1
  • Jaswant Singh  · 技术社区  · 7 年前

    我正在寻找一种在文本小部件上实现字幕样式的方法,以便在文本从屏幕溢出时自动开始滚动。 有办法吗。 我试过所有的装饰模式,但似乎找不到天棚选项。

    1 回复  |  直到 7 年前
        1
  •  12
  •   leodriesch    7 年前

    这个小部件是我设计的,我认为它可以满足您的需要:

    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);
        }
      }
    }
    

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

    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"))),
            ));
      }
    }