【问题标题】:flutter ScrollController attached to multiple scroll viewsFlutter ScrollController 附加到多个滚动视图
【发布时间】:2019-02-28 06:47:09
【问题描述】:

当呈现多个小部件实例并调用 getValue 方法时,flutter 会抛出错误 ScrollController 附加到多个滚动视图。我假设这是因为它们都使用相同的控制器,但我不知道如何解决此问题,而无需在每次使用时创建单独的小部件。有没有更好的方法来解决这个问题?

class NumScroller extends StatelessWidget{
  final int max,min;
  final double height,width;
  final TextAlign alignment;

  static ScrollController controller;

  NumScroller({this.height,this.width,this.alignment,this.min,this.max, initialOffset}){
    controller = new ScrollController(initialScrollOffset: initialOffset);
  }

  getValue() => (controller.offset~/height) + min;

  @override
  Widget build(BuildContext context) {
    return new Container(
        width: width,
        height: height,
        child: ListView.builder(itemBuilder: (context, index) {
          return new Container(height: height, child:Text((max - index).toString(),textAlign: alignment,));
          },
          itemCount: max - min+1,
          controller: controller,
          physics: PageScrollPhysics(),
          itemExtent: height,
        )
    );
  }

}

【问题讨论】:

  • 你应该使用有状态的小部件而不是无状态的。
  • 嗨@Remi,为什么应该是Stateful?。
  • 因为您可以为每个小部件实例拥有一个控制器。没有一个静态控制器随处使用。
  • 对不起,我不明白。即使使用Stateless,我们也可以为每个小部件实例拥有一个控制器
  • @DineshBalasubramanian 应该保留控制器。每次 props 更改时重新创建一个新的(使用 StatelessWidget 时会发生这种情况)会产生不良影响。

标签: dart flutter


【解决方案1】:

您应该为每个小部件实例配备一个控制器,而不是使用静态控制器。

您不能将控制器存储在 StatelessWidget 中(即使编译器允许这样做)。

为此,您需要一个 StatefulWidget,否则当您的小部件更新时,您将再次创建一个新控制器。导致奇怪的行为。

这里是最终代码:

class NumScroller extends StatefulWidget{
  final int max,min;
  final double height,width;
  final TextAlign alignment;

  NumScroller({this.height,this.width,this.alignment,this.min,this.max, initialOffset});

  @override
  NumScrollerState createState() {
    return new NumScrollerState();
  }
}

class NumScrollerState extends State<NumScroller> {
  final ScrollController controller = ScrollController();

  getValue() => (controller.offset~/widget.height) + widget.min;

  @override
  Widget build(BuildContext context) {
    return new Container(
        width: widget.width,
        height: widget.height,
        child: ListView.builder(itemBuilder: (context, index) {
          return new Container(height: widget.height, child:Text((widget.max - index).toString(),textAlign: widget.alignment,));
          },
          itemCount: widget.max - widget.min+1,
          controller: controller,
          physics: PageScrollPhysics(),
          itemExtent: widget.height,
        )
    );
  }
}

【讨论】:

【解决方案2】:

正如你所说的multiple instances are rendered,你得到了这个错误。当您的ScrollController 是多个(一对一视图)时,您不会遇到任何问题。但是你只有一个 ScrollController(因为你有 static)。

删除静态,它应该可以工作。

如果它不起作用,请让我知道。

【讨论】:

  • 是的,它有效。我不知道解决方案会这么简单
  • 别介意那个错误只是因为另一个错误而没有出现
  • 我不知道发生了什么,现在可以了
  • 我是这样为我的 3 listview.builder 创建的。它显示相同的错误。所以我无法跟踪/收听每个列表滚动。 _controller = 滚动控制器(); _controller.addListener(_scrollListener); _controller2 = 滚动控制器(); _controller2.addListener(_scrollListener2); _controller3 = 滚动控制器(); _controller3.addListener(_scrollListener3); @Dinesh - 和
  • 即使我为每个页面都有单独的 ScrollController,我也面临同样的问题,但是当我导航到下一页和返回上一页但没有 Navigator.pop() 时,问题就出现了然后它抛出错误。否则,当我返回 Navigator.pop() 时它工作正常
猜你喜欢
  • 2019-05-18
  • 2019-02-09
  • 2021-08-12
  • 1970-01-01
  • 1970-01-01
  • 2019-02-06
  • 2019-07-30
  • 2019-02-17
  • 2020-01-27
相关资源
最近更新 更多