【问题标题】:Flutter slider value is not update inside getx dialog颤振滑块值未在 getx 对话框中更新
【发布时间】:2021-09-25 14:47:04
【问题描述】:

我正在尝试在对话框中构建一个滑块小部件。我正在使用GetX 和 GetxController,但是当我尝试更改滑块或任何其他小部件时,它的值没有更新。

只有在我重新打开对话框后才会更新。这是我的控制器代码:

class SliderController extends GetxController {
  static SliderController get to => Get.find();

  var quality = 0.0.obs;

  void setQuality(double quality) {
    quality.value = quality;
    update();
  }
}

我的小部件看起来像这样:

class SliderWidget extends StatelessWidget {

  const SliderWidget ({Key? key}) : super(key: key);

  @override
  Widget build(BuildContext context) {
    return Opacity(
      opacity: 0.8,
      child: GetBuilder<SliderController>(
        init: SliderController(),
        builder: (ctrl) => Container(
          decoration: BoxDecoration(
            color: Colors.white70,
            borderRadius: const BorderRadius.all(Radius.circular(16)),
            boxShadow: [
              BoxShadow(
                color: Colors.grey.withOpacity(0.25),
                spreadRadius: 2,
                blurRadius: 2,
              ),
            ],
          ),
          child: Stack(
            children: <Widget>[
              Positioned(
                right: 0,
                top: 0,
                child: CustomCheckBox(
                  value: false,
                  shouldShowBorder: true,
                  borderColor: Colors.blueGrey,
                  checkedFillColor: Colors.blueGrey,
                  borderRadius: 8,
                  borderWidth: 2,
                  checkBoxSize: 22,
                  onChanged: (checked) {
                    if (checked) {
                      Get.defaultDialog(
                        textConfirm: "Save",
                        textCancel: "Cancel",
                        content: Column(
                          crossAxisAlignment: CrossAxisAlignment.center,
                          mainAxisSize: MainAxisSize.max,
                          children: <Widget>[
                            Text("Quality (${ctrl.quality})"),
                            Slider(
                              value: ctrl.quality.value,
                              min: 0,
                              max: 100,
                              divisions: 100,
                              onChanged: (double value) {
                                ctrl.setQuality(value);
                              },
                            )
                          ],
                        ),
                      );
                    }
                  },
                ),
              ),
            ]
          )
        )
      )
    );
  }
}

因此,对话框打开,我尝试拖动滑块,但它没有改变。似乎该值已保存在控制器中,因为如果我关闭对话框并再次打开它,滑块将具有新值。

我不知道如何让控制器更新对话框滑块内的值

【问题讨论】:

    标签: flutter slider flutter-getx


    【解决方案1】:

    我发现您使用了错误的组合。在这种情况下,您在控制器中使用 observables (.obs),但在小部件中使用 GetBuilder。 请记住,GetXObx 用于观察 observables(反应式状态管理)。 GetBuilder 用于简单的状态管理(Non-reactive/Non-observables)。

    因此,您可以将变量类型更改为普通 dart 类型,而不是控制器中的 Rx (.obs),例如:

    class SliderController extends GetxController {
      static SliderController get to => Get.find();
    
      double quality = 0.0;
    
      void setQuality(double quality) {
      this.quality = quality;
      update();
     }
    }
    

    或者您可以在您的小部件中使用GetXObx。在这种情况下,无需在控制器上调用update()

    【讨论】:

    • 谢谢。这让我回到文档并更好地理解这些概念。现在可以了
    猜你喜欢
    • 2021-11-19
    • 2021-12-11
    • 2020-06-02
    • 2019-01-31
    • 2021-09-02
    • 2022-01-05
    • 2022-01-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多