正在玩 flutter 上的滑块小部件,我不明白为什么它不更新不同小部件中的某些值,示例代码如下所示;
当我移动滑块时,它没有移动问题,但是即使 onchanged 相应地更新在设置状态下传递的变量,我尝试在另一个小部件上更新的值也不会更新。
任何帮助将不胜感激!
脚手架代码
class TestPage extends StatelessWidget {
static const id = "test_page";
@override
Widget build(BuildContext context) {
double testValue = 0;
return Scaffold(
body: Column(
children: [
Text("Hello World"),
TestBoxNumber(
numberDisplay: testValue,
),
TestSlider(testValue: testValue),
],
),
);
}
}
滑块代码
class TestSlider extends StatefulWidget {
double testValue;
TestSlider({required this.testValue});
@override
_TestSliderState createState() => _TestSliderState();
}
class _TestSliderState extends State<TestSlider> {
@override
Widget build(BuildContext context) {
return Slider(
activeColor: themeData.primaryColorLight,
value: widget.testValue,
min: 0,
max: 100,
divisions: 100,
label: widget.testValue.round().toString(),
onChanged: (double value) {
setState(() {
widget.testValue = value;
});
},
);
}
}
不同的小部件代码
class TestBoxNumber extends StatefulWidget {
final double numberDisplay;
const TestBoxNumber({required this.numberDisplay});
@override
_TestBoxNumberState createState() => _TestBoxNumberState();
}
class _TestBoxNumberState extends State<TestBoxNumber> {
@override
Widget build(BuildContext context) {
return Container(
child: Text(widget.numberDisplay.toString()),
);
}
}
答案 0 :(得分:1)
问题在于您构建 TestBoxNumber 小部件的方式是值 (testValue) 始终相同(testValue 永远不会从 TestSlider 小部件中返回)。
如何克服这个问题?
您可以使您的 TestPage 成为 StatefullWidget。然后从 TestSlider 创建回调,因此当您更改 TestSlider 中的值时,您将调用 TestPage 中的某些函数(其中包含 setState,从而导致重新渲染您的页面)。
或者,如果您不希望整个 TestPage 小部件处于全状态(假设,假设您预测其中包含许多其他静态小部件,并且您不希望它们被重新渲染,因为您刚刚移动了一个滑块),您可以创建包装 Statefull 小部件并将 TestSlider 和 TestBoxNumber 小部件放入其中。这是更灵活的方法,恕我直言。
UPD:顺便说一句,如果 TestBoxText 的唯一目的是显示文本并且您通过构造函数传递它的值,那么将 TestBoxText 设为有状态小部件是没有意义的。