Flutter:如何从子窗口小部件更新子(和父)窗口小部件的状态(父窗口小部件得到更新,子窗口不更新)

问题描述 投票:0回答:1

我已经为自己创建了一个小部件,它可以创建带有文本的表单开关或仅返回开关。现在我想在我的过滤器(父级)中多次使用这个名为

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,
    );
  }
}

亲切的问候和谢谢!

flutter dart state setstate stateful
1个回答
2
投票

State
StatefulWidget
更长寿。当使用新参数重新创建小部件实例时,旧的状态实例将被保留。

要获取状态更新数据,您有两种选择:

  • 使用
    widget.something
  • 从小部件访问数据
  • 更新 didUpdateWidget
  • 中的状态字段
© www.soinside.com 2019 - 2024. All rights reserved.