微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

颤动滑块值未在 getx 对话框内更新

如何解决颤动滑块值未在 getx 对话框内更新

我正在尝试在对话框中构建一个滑块小部件。我正在使用 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);
                              },)
                          ],);
                    }
                  },]
          )
        )
      )
    );
  }
}

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

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

解决方法

我发现您使用了错误的组合。在这种情况下,您在控制器中使用可观察对象 (.obs),但在小部件中使用 GetBuilder。 请记住,GetXObx 用于观察可观察对象(反应状态管理)。 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()

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?