gpt4 book ai didi

flutter - 从子/孙小部件刷新对话框和父级

转载 作者:行者123 更新时间:2023-12-04 10:29:51 24 4
gpt4 key购买 nike

我有一个带有单选按钮的对话框,我想在用户点击它们时刷新它,我也希望它也刷新父级。对类似问题的回答建议将对话框的内容包装在 StatefulBuilder 中。 ,但这不起作用,因为对话框的子级是这些 dialogOption 小部件。

我做了一个简单的例子:

class _MyHomePageState extends State<MyHomePage> {
String selectedOption = "None";

Widget dialogOption({@required String optionName}) {
return InkWell(
child: Row(children: [
Icon(
optionName == selectedOption
? Icons.radio_button_checked
: Icons.radio_button_unchecked,
),
Text(optionName),
]),
onTap: () {
setState(() {
selectedOption = optionName;
});
},
);
}

@override
Widget build(BuildContext context) {
return Scaffold(
body: Column(
children: [
Text("Selected option: $selectedOption"),
RaisedButton(
child: Text("Open dialog"),
onPressed: () {
showDialog(
context: context,
builder: (BuildContext context) {
return AlertDialog(
content: Column(
mainAxisSize: MainAxisSize.min,
children: [
dialogOption(optionName: "Option 1"),
dialogOption(optionName: "Option 2"),
],
),
);
});
},
)
],
),
);
}
}

点击上面的 dialogOption 小部件只会刷新父级。

现在如果我用 StatefulBuilder像这样:
return AlertDialog(
content: StatefulBuilder(
builder: (BuildContext context, StateSetter setState) {
return Column(
mainAxisSize: MainAxisSize.min,
children: [
// tapping will NOT refresh dialog
dialogOption(optionName: "Option 1"),
// tapping will NOT refresh dialog
dialogOption(optionName: "Option 2"),
InkWell(
child: Text("This will refresh dialog"),
onTap: () { // this WILL refresh dialog
setState(() {});
},
),
],
);
},
),
);

点击两个 dialogOption 小部件不会刷新对话框,但点击上面的 Inkwell 会刷新。我不知道这有什么区别,但显然我希望这两个选项刷新对话框和父级。

最佳答案

enter image description here

class _MyHomePageState extends State<MyHomePage> {
String selectedOption = "None";

Widget dialogOption({@required String optionName, @required Function refresh}) {
return InkWell(
child: Row(
children: [
Icon(
optionName == selectedOption ? Icons.radio_button_checked : Icons.radio_button_unchecked,
),
Text(optionName),
],
),
onTap: () {
refresh(() {
setState(() {
selectedOption = optionName;
});
});
},
);
}

@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(),
body: Column(
children: [
Text("Selected option: $selectedOption"),
RaisedButton(
child: Text("Open dialog"),
onPressed: () {
showDialog(
context: context,
builder: (BuildContext context) {
return StatefulBuilder(
builder: (context, refresh) {
return AlertDialog(
content: Column(
mainAxisSize: MainAxisSize.min,
children: [
dialogOption(optionName: "Option 1", refresh: refresh),
dialogOption(optionName: "Option 2", refresh: refresh),
],
),
);
},
);
},
);
},
)
],
),
);
}
}

关于flutter - 从子/孙小部件刷新对话框和父级,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60466884/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com