我无法理解 flutter 中的状态管理,我有以下构建方法:
Widget build(BuildContext context) {
print("calling build with selectedItem: $selectedItem");
// TODO: implement build
return SafeArea(
child: SingleChildScrollView(
child: Padding(
padding: const EdgeInsets.all(8.0),
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
mainAxisSize: MainAxisSize.min,
children: [
Flexible(
fit: FlexFit.loose,
child: DropdownButton<String>(
value: selectedItem,
style: const TextStyle(color: Colors.black),
underline: Container(height: 2, color: Colors.deepPurpleAccent),
icon: Icon(Icons.arrow_downward),
iconSize: 20,
elevation: 16,
items: widget.streetNamesList
.map<DropdownMenuItem<String>>((String value) {
return DropdownMenuItem<String>(
value: value, child: Text(value));
}).toList(),
onChanged: (String? value) {
setState(() {
selectedItem = value;
});
},
),
),
SizedBox(height: 10.0,),
CarListPerStreetWidgetV2(streetName: selectedItem,)
],
),
)),
);
}
CarListPerStreetWidget 实现了一个未来的提供程序,该提供程序使用街道名称从数据库中获取数据。 问题是,当我从下拉菜单中选择一个新值时,尽管构建方法被执行,
CarListPerStreetWidgetV2
的构建方法也会被执行,但小部件不会用新的selectedItem
重新初始化。猜测小部件会初始化一次,但如何将从一个小部件更改到另一个小部件的状态传递给另一个?
您可以分享 CarListPerStreetWidgetV2 小部件吗?如果此小部件是
StatefulWidget
,您必须在 didUpdateWidget
中更新该小部件。
例如:
@override
void didUpdateWidget(covariant CarListPerStreetWidgetV2 oldWidget) {
super.didUpdateWidget(oldWidget);
if(oldWidget.streetName != widget.streetName) {
setState(() {});
}
}