颤动滑块值不会在 getx 对话框中更新
Flutter slider value is not update inside getx dialog
我正在尝试在对话框中构建一个滑块小部件。我正在使用 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
。
请记住,GetX
或 Obx
用于观察可观察对象(反应状态管理)。 GetBuilder
用于简单的状态管理(Non-reactive/Non-observables)。
因此您可以在控制器中将变量类型更改为普通飞镖类型而不是 Rx (.obs),例如:
class SliderController extends GetxController {
static SliderController get to => Get.find();
double quality = 0.0;
void setQuality(double quality) {
this.quality = quality;
update();
}
}
或者您可以在小部件中使用 GetX
或 Obx
。在这种情况下,无需在控制器上调用 update()
。
我正在尝试在对话框中构建一个滑块小部件。我正在使用 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
。
请记住,GetX
或 Obx
用于观察可观察对象(反应状态管理)。 GetBuilder
用于简单的状态管理(Non-reactive/Non-observables)。
因此您可以在控制器中将变量类型更改为普通飞镖类型而不是 Rx (.obs),例如:
class SliderController extends GetxController {
static SliderController get to => Get.find();
double quality = 0.0;
void setQuality(double quality) {
this.quality = quality;
update();
}
}
或者您可以在小部件中使用 GetX
或 Obx
。在这种情况下,无需在控制器上调用 update()
。