首页 > 解决方案 > 从颤动的警报对话框中更改地图的值时如何在ListVIew上查看动态值?

问题描述

这是我正在初始化的地图。

  Map<String, int> cart = {};

这是脚手架内的列表视图,用于查看地图的“值”和“键”。我正在读取条形码值,当按下浮动按钮时,它会弹出一个警报框来更改地图的值。价值观正在改变。

 ListView.builder(
                itemCount: cart.length,
                itemBuilder: (BuildContext context, int index) {
                  String key = cart.keys.elementAt(index);
                  return Center(
                    child: ListTile(
                      title: Text(key),
                      subtitle: Text(cart[key].toString()),
                    ),
                  );
                }),
///

floatingActionButton: FloatingActionButton(
        onPressed: () {
          String barcodeScanRes = await FlutterBarcodeScanner.scanBarcode(
              "#ff6666", "Cancel", true, ScanMode.DEFAULT);

          cart.putIfAbsent(barcodeScanRes, () => 1);
          print(cart);
          createDialog(context, barcodeScanRes);

        },

但问题是即使地图的值发生更改,它也不会更新列表视图。

createDialog(BuildContext context, String value) {
    return showDialog(
        context: context,
        builder: (context) {
          return StatefulBuilder(builder: (context, setState) {
            return AlertDialog(
                title: Text(value.toString()),
                content: Container(
                  child: Row(
                    children: <Widget>[
                      SizedBox(width: 100.0),
                      IconButton(
                        icon: Icon(Icons.add),
                        onPressed: () {
                          // print(cart[value]);
                          setState(() {
                            cart[value]++;
                          });
                        },
                        color: Colors.blue,
                      ),
                      Text(
                        cart[value].toString(),
                        style: TextStyle(
                            fontSize: 20, fontWeight: FontWeight.bold),
                      ),
                      IconButton(
                          icon: Icon(Icons.remove),
                          onPressed: () {
                            setState(() {
                              cart[value]--;
                            });
                          },
                          color: Colors.blue)
                    ],
                  ),
                ));
          });
        });
  }

我该如何解决这个问题?

标签: flutterdart

解决方案


对话框中的 setState 将不起作用,您需要将函数作为参数传递给实际的 setState 工作。

void onRemove() {
                            setState(() {
                              cart[value]--;
                            });
                          }


void onAdd() {
                          // print(cart[value]);
                          setState(() {
                            cart[value]++;
                          });
                        }


floatingActionButton: FloatingActionButton(
        onPressed: () {
          String barcodeScanRes = await FlutterBarcodeScanner.scanBarcode(
              "#ff6666", "Cancel", true, ScanMode.DEFAULT);

          cart.putIfAbsent(barcodeScanRes, () => 1);
          print(cart);
          createDialog(context, barcodeScanRes,onAdd,onRemove);

        },
createDialog(BuildContext context, String value, Function onAdd, Function onRemove) {
    return showDialog(
        context: context,
        builder: (context) {
          return StatefulBuilder(builder: (context, setState) {
            return AlertDialog(
                title: Text(value.toString()),
                content: Container(
                  child: Row(
                    children: <Widget>[
                      SizedBox(width: 100.0),
                      IconButton(
                        icon: Icon(Icons.add),
                        onPressed: onAdd,
                        color: Colors.blue,
                      ),
                      Text(
                        cart[value].toString(),
                        style: TextStyle(
                            fontSize: 20, fontWeight: FontWeight.bold),
                      ),
                      IconButton(
                          icon: Icon(Icons.remove),
                          onPressed: onRemove,
                          color: Colors.blue)
                    ],
                  ),
                ));
          });
        });
  }

推荐阅读