颤振 |将值从 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 中的值发生变化时需要调用该函数。
我需要一个 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 中的值发生变化时需要调用该函数。