Ahm*_*oez 1 showdialog setstate dart flutter
在我的代码中使用有状态小部件和setstate以及showdialog和Alertdialog似乎无法正常工作,但为了简化起见,我在这里用更小更简单的代码模拟了同样的问题,以便更好地理解问题
import 'package:flutter/material.dart';
import '../widgets/app_drawer.dart';
class Test extends StatefulWidget {
@override
State<Test> createState() => _TestState();
}
class _TestState extends State<Test> {
int x = 0;
@override
Widget build(BuildContext context) {
return Scaffold(
drawer: AppDrawer(),
appBar: AppBar(
title: Text("Shop"),
),
body: Column(
children: [
RaisedButton(
onPressed: () {
showDialog(
context: context,
builder: (ctx) => AlertDialog(
title: Text("hey"),
content: Text(x.toString()),
actions: [
RaisedButton(
onPressed: () {},
child: Text("click me"),
),
RaisedButton(
onPressed: () {
setState(() {
x++;
});
},
child: Text("increment"),
)
],
),
);
},
child: Text("Click"),
),
Text(x.toString()),
],
),
);
}
}
Run Code Online (Sandbox Code Playgroud)
如果您运行这段代码,您会注意到数字在后台增加,但在弹出对话框上没有增加,要查看更改,您必须关闭对话框并重新打开它才能查看实际代码的最新值(非简化版本)基于相同的想法但略有不同
这个想法基于商店订单,您可以在其中看到装有产品的购物车,当您单击“编辑购物车产品”时,会出现一个弹出对话框,其中包含产品的先前值,并且可以从购物车中删除或添加产品,然后单击“更新”按钮。如果产品列表不为空,按钮的onPressed值可以是批准新购物车的函数;如果您从购物车中删除了所有产品,则按钮的 onPressed 值可以为空(禁用按钮),但它似乎不会立即起作用。按钮看起来像这样
RaisedButton(
onPressed: orderCart.isEmpty
? null
: () {
//Function here
},
child: Text(
"Update",
),
),
Run Code Online (Sandbox Code Playgroud)
您应该使用StatefulBuilder
inshowDialog
来使用 setState((){});
...
body: Column(
children: [
RaisedButton(
onPressed: () {
showDialog(
context: context,
builder: (BuildContext context) {
return StatefulBuilder(
builder: (context, StateSetter setState) {
return AlertDialog(
...
Run Code Online (Sandbox Code Playgroud)