颤动滑块不更新小部件变量

时间:2021-05-19 10:03:06

标签: flutter

正在玩 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()),
    );
  }
}

1 个答案:

答案 0 :(得分:1)

问题在于您构建 TestBoxNumber 小部件的方式是值 (testValue) 始终相同(testValue 永远不会从 TestSlider 小部件中返回)。

如何克服这个问题?

您可以使您的 TestPage 成为 StatefullWidget。然后从 TestSlider 创建回调,因此当您更改 TestSlider 中的值时,您将调用 TestPage 中的某些函数(其中包含 setState,从而导致重新渲染您的页面)。

或者,如果您不希望整个 TestPage 小部件处于全状态(假设,假设您预测其中包含许多其他静态小部件,并且您不希望它们被重新渲染,因为您刚刚移动了一个滑块),您可以创建包装 Statefull 小部件并将 TestSlider 和 TestBoxNumber 小部件放入其中。这是更灵活的方法,恕我直言。

这是将两个小部件包装在另一个小部件中的意思的小方案: enter image description here

UPD:顺便说一句,如果 TestBoxText 的唯一目的是显示文本并且您通过构造函数传递它的值,那么将 TestBoxText 设为有状态小部件是没有意义的。