Flutter ScrollController附加到多个滚动视图

时间:2018-09-24 17:44:58

标签: dart flutter

当呈现窗口小部件的多个实例并且调用getValue方法时,将引发错误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,
        )
    );
  }

}

2 个答案:

答案 0 :(得分:2)

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

尽管如此,您也不能将控制器存储在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,
        )
    );
  }
}

答案 1 :(得分:-1)

正如您在告诉multiple instances are rendered时一样,您遇到此错误。当您的ScrollController为多个(一对一视图)时,不会有任何问题。但是您只有一个ScrollController(因为您具有静态)。

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

请让我知道它是否无效。