setstate 不适用于 showdialog 和 Alertdialog

Ahm*_*oez 1 showdialog setstate dart flutter

在我的代码中使用有状态小部件和setstate以及showdialogAlertdialog似乎无法正常工作,但为了简化起见,我在这里用更小更简单的代码模拟了同样的问题,以便更好地理解问题

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)

Sha*_*bic 7

您应该使用StatefulBuilderinshowDialog来使用 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)