flutter - 从颤动的警报对话框中更改地图的值时如何在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)
],
),
));
});
});
}
我该如何解决这个问题?
解决方案
对话框中的 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)
],
),
));
});
});
}
推荐阅读
- python - 将节点包包含到 Python AWS Lambda 中
- swift - 在屏幕上创建一个随机 CGPoint 节点
- python - 将行与用户名进行比较时的逻辑问题
- cuda - 你如何获得与推力执行策略相关的流?
- c++ - c++ 优先级队列中的多重比较?
- c# - 如何在 C# 中使用树视图更改表单控件?
- monkey-x - 为什么我在最后几行中不断收到“意外令牌'方法'”的语法错误
- bash - 如何将 bash 中的“代码”更改为“代码”。
- python - 访问具有先前非唯一日期的行
- android - 在 remoteMessage.getNotification() 找不到 com.google.android.gms.internal.zzbgl 的类文件