我已经为自己创建了一个小部件,它可以创建带有文本的表单开关或仅返回开关。现在我想在我的过滤器(父级)中多次使用这个名为
PlatformSwitch
(子级)的小部件。
为了更正过滤器中的选定值,我需要将选定值(
true
或 false
)从每个开关传递回过滤器。我已经尝试解决这个问题,但我根本无法将谷歌的解决方案适应我的代码。
即使我选择了正确的值,onChange 方法也会被触发,但是再次传递给子级的值是旧值。怎么会这样?
我已经尝试将我的
PlatformSwitch
包装在Obx
中的GetX
中,但这会导致完全相同的问题。有谁知道如何再次更新子值?
打印值:
flutter: Selected: false <-- Initialized
flutter: State update: true <-- Updated
flutter: Selected: false <-- Reinitialized with wrong value!
过滤器(父级):
class FilterModal extends StatefulWidget {
const FilterModal({Key? key}) : super(key: key);
@override
State<FilterModal> createState() => _FilterModalState();
}
class _FilterModalState extends State<FilterModal> {
bool showExpiredProducts = false;
_FilterModalState();
final FilterController filterController = Get.put(FilterController());
@override
Widget build(BuildContext context) {
return Scaffold(
body: PlatformSwitch(
selected: showExpiredProducts,
onlySwitch: false,
prefix: "Abgelaufen Angebote anzeigen",
onChanged: (value) {
setState(() {
print("State update: " + value.toString());
showExpiredProducts = value;
});
}),
);
}
}
平台切换(子级):
class PlatformSwitch extends StatefulWidget {
String? prefix;
bool onlySwitch;
bool selected;
ValueChanged onChanged;
PlatformSwitch(
{Key? key,
this.selected = false,
this.onlySwitch = true,
this.prefix,
required this.onChanged})
: super(key: key);
@override
// ignore: no_logic_in_create_state
_PlatformSwitchState createState() => _PlatformSwitchState(
selected,
onlySwitch,
prefix,
onChanged);
}
class _PlatformSwitchState extends State<PlatformSwitch> {
String? prefix;
bool onlySwitch;
bool selected;
ValueChanged onChanged;
_PlatformSwitchState(
this.selected,
this.onlySwitch,
this.prefix,
this.onChanged);
@override
Widget build(BuildContext context) {
print("Selected: " + selected.toString());
if (!onlySwitch) {
return platformFormRowSwitch();
}
return platformSwitch();
}
platformFormRowSwitch() {
return Container(
child: Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [
Column(
children: [Text(prefix!)],
),
Column(
children: [platformSwitch()],
)
],
));
}
platformSwitch() {
if (defaultTargetPlatform == TargetPlatform.android) {
return Switch(
value: selected,
onChanged: onChanged
);
}
return CupertinoSwitch(
value: selected,
onChanged: onChanged,
);
}
}
亲切的问候和谢谢!
State
比StatefulWidget
更长寿。当使用新参数重新创建小部件实例时,旧的状态实例将被保留。
要获取状态更新数据,您有两种选择:
widget.something