我有两个小部件,widget1和widget2。 Widget1:我在此小部件中添加了一个下拉菜单。现在,我想在下拉项更改事件中更新widget2的views属性(例如颜色和名称)。
那么,我可以使用界面来满足以上要求吗?还是还有其他方法可以执行相同的操作?
Widget1
- Text
- DropdownButton
- OnChange(){
// Update widget2 (change txt1 & color1 values)
}
Widget2
- Text
- Container
- Card
- Text (txt1, color1...)
答案 0 :(得分:4)
诀窍是拥有一个有状态的共同祖先小部件:
WidgetParent (StatefulWidget)
- Widget1 (displays the dropdown)
- Widget2 (displays the text/color)
将Widget1的选择传递给父对象(使用回调)。选择内容存储在父窗口小部件的状态中,并通过构造函数参数传递给Widget2。父级调用setState
,这将重建所有子级。
示例代码:
import 'package:flutter/material.dart';
class ParentWidget extends StatefulWidget {
@override
_ParentWidgetState createState() => _ParentWidgetState();
}
class _ParentWidgetState extends State<ParentWidget> {
String _text = 'hello world';
Color _color = Colors.red;
void _onSelectionChanged(int value) {
if (value == 0) {
setState(() {
_text = "0 selected";
_color = Colors.blue;
});
} else if (value == 1) {
setState(() {
_text = "1 selected";
_color = Colors.yellow;
});
} else {
setState(() {
_text = "unknown value selected";
_color = Colors.black;
});
}
}
@override
Widget build(BuildContext context) {
return Column(
children: <Widget>[
Widget1(
onChanged: _onSelectionChanged,
),
Widget2(
text: _text,
color: _color,
)
],
);
}
}
class Widget1 extends StatelessWidget {
final ValueChanged<int> onChanged;
const Widget1({Key key, this.onChanged}) : super(key: key);
@override
Widget build(BuildContext context) {
return DropdownButton<int>(
items: [
DropdownMenuItem(child: Text("Zero"), value: 0),
DropdownMenuItem(child: Text("One"), value: 1),
],
onChanged: onChanged,
);
}
}
class Widget2 extends StatelessWidget {
final String text;
final Color color;
const Widget2({Key key, this.text, this.color}) : super(key: key);
@override
Widget build(BuildContext context) {
return Container(
color: color,
child: Text(text),
);
}
}
答案 1 :(得分:0)
我认为您想要做的是传递需要执行的功能 像这样
Widget1 (this._onChangeFunction); // get a ref to the Function needed later
final Function _onChangeFunction;
- Text
- DropdownButton
- OnChange(){
// Update widget2 (change txt1 & color1 values)
_onChangeFunction(txt, color);
}
Widget2
fun _changeText(String txt, String color) {
// called by Widget1, change the Text... in this private function
}
// some reference to Widget1, nested in your Card perhaps?
Widget1(_changeText);
- Text
- Container
- Card
- Text (txt1, color1...)