颤振 |将值从 child 传递到 parent

Flutter | Pass value from child to parent

我需要一个 DropdownButton,其中的项目取决于另一个 DropdownButton。听起来有点混乱,但事实并非如此。这是我的代码,在重要部分有注释,以便理解我的意图。

Parent

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

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

class _ParentState extends State<Parent> {
  @override
  Widget build(BuildContext context) {
    return SafeArea(
      child: SizedBox(
        width: 500,
        height: 500,
        child: Column(
          children: const [
            // Main
            DropDownWidget(collection: "MainCollection",),
            // Depending
            DropDownWidget(collection: ""), // Collection should equals value from Main DropDownWidget
          ],
        ),
      ),
    );
  }
}

Child

class DropDownWidget extends StatefulWidget {
  final String collection;
  const DropDownWidget({Key? key, required this.collection}) : super(key: key);

  @override
  State<DropDownWidget> createState() => _DropDownWidgetState();
}

class _DropDownWidgetState extends State<DropDownWidget> {
  var selectedItem;

  @override
  Widget build(BuildContext context) {
    return StreamBuilder<QuerySnapshot>(
        stream: FirebaseFirestore.instance
            .collection(widget.collection)
            .snapshots(),
        builder: (context, snapshot) {
          if (!snapshot.hasData || snapshot.hasError) {
            return const CircularProgressIndicator();
          } else {
            var length = snapshot.data?.docs.length;
            List<DropdownMenuItem<String>> items = [];
            for (int i = 0; i < length!; i++) {
              DocumentSnapshot snap = snapshot.data!.docs[i];
              items.add(DropdownMenuItem(
                child: Text(snap.id),
                value: snap.id,
              ));
            }
            return DropdownButtonFormField<String>(
                onChanged: (value) {
                  setState(() {
                    selectedItem = value;
                    // ********************
                    // PASS value TO PARENT
                    // ********************

                  });
                },
                value: selectedItem,
                items: items);
          }
        });
  }
}

当 Main DropdownButton 更改其值时,它应该将其传递给我的 parent 以更改我依赖的 DropdownButton 的焦点集合。我已经通过将所有代码放在一个 class 中解决了这个问题,但这不是我想要的方式。 所以也许你可以帮助我 :) 谢谢

在你的 child 中创建一个参数 ValueChanged<String> onSelectItem。当值改变时调用该方法。

然后在您的 parent 中,您提供了一个函数,当您的 child 中的值发生变化时需要调用该函数。