Dart 附加到多个滚动视图的颤振滚动控制器

Dart 附加到多个滚动视图的颤振滚动控制器,dart,flutter,Dart,Flutter,当呈现小部件的多个实例并且getValue方法被称为flatter时,抛出附加到多个滚动视图的ScrollController错误。我假设这是因为它们都使用同一个控制器,但我不知道如何在每次使用时不创建单独的小部件来解决这个问题。有没有更好的方法来解决这个问题 class NumScroller extends StatelessWidget{ final int max,min; final double height,width; final TextAlign alignmen

当呈现小部件的多个实例并且getValue方法被称为flatter时,抛出附加到多个滚动视图的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,
        )
    );
  }

}

正如您所说,当呈现多个实例时,
会出现此错误。当您的
ScrollController
是多个(一对一视图)时,您不会遇到任何问题。但是您只有一个ScrollController(因为您有静态

去除静电,它应该可以工作


请让我知道它是否工作。

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

但是,您不能将控制器存储在无状态小部件中(即使编译器允许)

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

这里是最终代码:

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,
        )
    );
  }
}
类NumScroller扩展StatefulWidget{
最终整数最大值,最小值;
最终双倍高度、宽度;
最终文本对齐;
NumScroller({this.height,this.width,this.alignment,this.min,this.max,initialOffset});
@凌驾
NumScrollerState createState(){
返回新的NumScrollerState();
}
}
类NumScrollerState扩展状态{
最终ScrollController=ScrollController();
getValue()=>(controller.offset~/widget.height)+widget.min;
@凌驾
小部件构建(构建上下文){
退回新货柜(
宽度:widget.width,
高度:widget.height,
子级:ListView.builder(itemBuilder:(上下文,索引){
返回新容器(高度:widget.height,子级:Text((widget.max-index.toString(),textAlign:widget.alignment,);
},
itemCount:widget.max-widget.min+1,
控制器:控制器,
物理:物理(),
itemExtent:widget.height,
)
);
}
}

您应该使用有状态的小部件,而不是无状态的。嗨@Remi,为什么这应该是有状态的呢?因为这样,小部件的每个实例都可以有一个控制器。没有一个静态控制器到处使用。对不起,我不明白。即使使用无状态
,我们也可以为每个widget@DineshBalasubramanian应保留控制器。每当道具发生变化时(使用无状态小部件时会发生这种情况),重新创建一个新道具会产生不期望的效果。是的,它成功了。我不知道解决方案会这么简单,但请记住,错误只是因为另一个错误而没有出现。我不知道发生了什么,现在可以了,也许可以了,但是你不能访问getValue函数。你是什么意思?如果愿意,您可以从其他人处访问小部件的状态。如何访问?据我所知,您只能访问有状态小部件中的属性和方法,而不能访问其stateSee或