Flutter Xlider - setState - 值保持为 0 并快速返回
Flutter Xlider - setState - value remains 0 and snaps back
这可能只是一个简单的问题,但我现在无法弄明白。我正在垂直使用 Flutter xslider https://pub.dev/packages/flutter_xlider,值从 0 到 90。当我拖动滑块时,它会根据滑块的值重新绘制一条线,同时它会更改 TextField 中的数值。这曾经有效,但在添加 TextField 并更新所有组件(Flutter.Dart.Packages.AndroidStudio)后,我遇到以下问题:
由于 onDragging
中的 setState(() { });
行,滑块的值始终 保持为 0,并在拖动完成后迅速返回 。如果我省略了 setState 方法,则滑块可以工作,但是我的线当然不会被绘制。我究竟做错了什么?搭建的时候跟周围的构件有关系吗?还是有其他原因?
更新:我找到了解决方案。 我现在自己更新值 属性 例如 values: [sliderValue]
而 sliderValue
是双初始化一次,然后在 onDragging
内更新。奇怪的是,文档中从未建议过
body: Column(
children: [
new Padding(
padding: new EdgeInsets.all(15.0),
),
angleTextQuestion,
new Padding(
child: Column(children:[ TextField( controller: txtAngleC,
keyboardType: TextInputType.number,
onChanged: (text) {
double angle = double.parse(text);
if(angle >= 0 && angle <= 90) {
_angleAirplane = double.parse(text);
setState(() {});
}
},),
Text("(type in a value between 0 - 90)")
]),
padding: new EdgeInsets.all(15.0),
),
Expanded( child: new Row( children: [
new Padding(
padding: new EdgeInsets.all(20.0),
),
Expanded( child: new SizedBox(
height: 250,
width: 50,
child: FlutterSlider(
values: [0],
rangeSlider: false,
max: 90,
min: 0,
rtl: true,
step: FlutterSliderStep(step: 1.0),
axis: Axis.vertical,
tooltip: FlutterSliderTooltip(
textStyle: TextStyle(fontSize: 14, color: Colors.lightBlue),
),
onDragging: (handlerIndex, lowerValue, upperValue) {
_angleAirplane = lowerValue;
txtAngleC.text = _angleAirplane.toString();
setState(() { });
},
))),
Text(_angleAirplane.toString()),
new Padding(
padding: new EdgeInsets.all(10.0),
),
Expanded( child: new CustomPaint(
foregroundPainter: new AnglePainter(
angle: _angleAirplane
)))
]
)),
]
),
```
将values:[0]
改成这个
values: [_angleAirplane]
发生这种情况是因为在您的 onDragging
方法中有一个 setState
并使用 0 值重绘滑块。
这可能只是一个简单的问题,但我现在无法弄明白。我正在垂直使用 Flutter xslider https://pub.dev/packages/flutter_xlider,值从 0 到 90。当我拖动滑块时,它会根据滑块的值重新绘制一条线,同时它会更改 TextField 中的数值。这曾经有效,但在添加 TextField 并更新所有组件(Flutter.Dart.Packages.AndroidStudio)后,我遇到以下问题:
由于 onDragging
中的 setState(() { });
行,滑块的值始终 保持为 0,并在拖动完成后迅速返回 。如果我省略了 setState 方法,则滑块可以工作,但是我的线当然不会被绘制。我究竟做错了什么?搭建的时候跟周围的构件有关系吗?还是有其他原因?
更新:我找到了解决方案。 我现在自己更新值 属性 例如 values: [sliderValue]
而 sliderValue
是双初始化一次,然后在 onDragging
内更新。奇怪的是,文档中从未建议过
body: Column(
children: [
new Padding(
padding: new EdgeInsets.all(15.0),
),
angleTextQuestion,
new Padding(
child: Column(children:[ TextField( controller: txtAngleC,
keyboardType: TextInputType.number,
onChanged: (text) {
double angle = double.parse(text);
if(angle >= 0 && angle <= 90) {
_angleAirplane = double.parse(text);
setState(() {});
}
},),
Text("(type in a value between 0 - 90)")
]),
padding: new EdgeInsets.all(15.0),
),
Expanded( child: new Row( children: [
new Padding(
padding: new EdgeInsets.all(20.0),
),
Expanded( child: new SizedBox(
height: 250,
width: 50,
child: FlutterSlider(
values: [0],
rangeSlider: false,
max: 90,
min: 0,
rtl: true,
step: FlutterSliderStep(step: 1.0),
axis: Axis.vertical,
tooltip: FlutterSliderTooltip(
textStyle: TextStyle(fontSize: 14, color: Colors.lightBlue),
),
onDragging: (handlerIndex, lowerValue, upperValue) {
_angleAirplane = lowerValue;
txtAngleC.text = _angleAirplane.toString();
setState(() { });
},
))),
Text(_angleAirplane.toString()),
new Padding(
padding: new EdgeInsets.all(10.0),
),
Expanded( child: new CustomPaint(
foregroundPainter: new AnglePainter(
angle: _angleAirplane
)))
]
)),
]
),
```
将values:[0]
改成这个
values: [_angleAirplane]
发生这种情况是因为在您的 onDragging
方法中有一个 setState
并使用 0 值重绘滑块。