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