如何在Flutter中更新子对象和子对象中的变量

rdlzhqv9  于 2023-04-22  发布在  Flutter
关注(0)|答案(2)|浏览(158)

我有一个场景,我有一个按钮,在孙子小部件,更新一个变量和“发送”更新的变量给孩子。孩子使用它收到的变量,即在孩子小部件中的另一个变量中使用。孩子因此也更新一个变量,并将其推到父。我想知道是否有可能更新所有的变量,只需点击一个按钮,在孙子小部件。
这是我的孙子:

class GrandChild extends StatefulWidget {
  Function(int) changeNumber;
  GrandChild(this.changeNumber, {super.key});

  @override
  State<GrandChild> createState() => _GrandChildState();
}

class _GrandChildState extends State<GrandChild> {
  int counter = 0;

  @override
  Widget build(BuildContext context) {
    return ElevatedButton(
        onPressed: () {
          setState(() {
            ++counter;
            widget.changeNumber(counter);
          });
        },
        child: const Text('Update all'));
  }
}

这是我的孩子:

class Child extends StatefulWidget {
  Function(int) updateParent;//I think this will be needed to update parent
  Child(this.updateParent, {super.key});

  @override
  State<Child> createState() => _ChildState();
}

class _ChildState extends State<Child> {
  int childCounter = 0;
  int multiple = 1;
  int amountInChild = 0;

  fromGrandChild(int newChildCounter) {
    setState(() {
      childCounter = newChildCounter;
    });
  }

  @override
  Widget build(BuildContext context) {
    amountInChild = childCounter * multiple;//this is what I need to update in parent
    return GrandChild(fromGrandChild);
  }
}

这里是Parent:

class Parent extends StatelessWidget {
   Parent({Key? key}) : super(key: key);
  int amountInParent = 0;
  receiveFromChild(int newFromChld) {
    amountInParent = newFromChld;
  }

  @override
  Widget build(BuildContext context) {
    return Container(
      child: Column(
        children: [
          Child(receiveFromChild),
          Text(amountInParent.toString())
        ],
      ),
    );
  }
}

我不希望在子项中包含另一个按钮来更新父项,只希望在子项中包含提升的按钮来更新所有位置。
我在孙子中使用了回调函数。

tp5buhyn

tp5buhyn1#

我不确定我是否完全理解了你的问题,但我相信现在需要的就是在fromGrandChild中调用updateParent

fromGrandChild(int newChildCounter) {
    setState(() {
      childCounter = newChildCounter;
    });
    widget.updateParent(newChildCounter); //or whatever value you want to pass.
  }
velaa5lx

velaa5lx2#

实际上你可以做的是在parent中声明一个函数,然后把这个函数传给child,然后传给grandchild,在那里你可以更新任何你想要的值

相关问题