重置兄弟姐妹的状态

Reset State of sibling

我正在尝试从另一个 class 重置我的 DropdownButton class (SomeButton) 的字符串 (dropdownValue) 的值,这是一个兄弟姐妹。更准确地说,这是一些带有注释的代码

Parent(包含两个兄弟姐妹)

class Parent extends StatelessWidget {
  const Parent({Key? key}) : super(key: key);

  @override
  Widget build(BuildContext context) {
    return Column(
      children: [
        Whosebug(),
        SomeButton(),
      ],
    );
  }
}

下拉菜单 Class(包含我想从按钮 class 重置的下拉值)

class Whosebug extends StatefulWidget {
  const Whosebug({Key? key}) : super(key: key);

  @override
  State<Whosebug> createState() => _WhosebugState();
}

class _WhosebugState extends State<Whosebug> {
  String? dropdownValue;
  @override
  Widget build(BuildContext context) {
    return DropdownButtonHideUnderline(
      child: DropdownButton2(
          items: someItems,
          onChanged: (value) {
            setState(() {
              dropdownValue = value as String;
            });
          },
          value: dropdownValue),
    );
  }
}

Button(onTap -> 从上方清除 dropdownValue class)

class SomeButton extends StatelessWidget {
  const SomeButton({Key? key}) : super(key: key);

  @override
  Widget build(BuildContext context) {
    return InkWell(
      onTap: () {
        // reset dropdownValue
      },
    );
  }
}

当我搜索解决方案时,密钥可能是一个选项。但老实说,我从未使用过密钥,也没有看到任何关于我的问题的明确文档。也可以使用 Provider,但我无法初始化我的 dropdownValue,因为到目前为止还没有用户交互时我应该是空的。如果能提供任何帮助,我将不胜感激:)

您可以使用 parent class 中的回调函数。

    class Parent extends StatefulWidget {
  const Parent({Key? key}) : super(key: key);

  @override
  State<Parent> createState() => _ParentState();
}

class _ParentState extends State<Parent> {
  String? dropdownValue;
  @override
  Widget build(BuildContext context) {
    return Column(
      children: [
        Whosebug(
          dropdownValue: dropdownValue,
          onChanged: (value) {
            setState(() {
              dropdownValue = value;
            });
          },
        ),
        SomeButton(
          dropdownValue: dropdownValue,
          onTap: () {
//reset dropdownValue to whatever you want
          },
        ),
      ],
    );
  }
}