flutter - 如何在颤振中使用地图来解决我遇到的问题
问题描述
Hi I have these 2 dropdown widgets and one tag selector widget
//add drug
String drugName;
String drugForm;
List<String> drugPower=[];
//add drug list
var drugList = [];
Padding(
padding: const EdgeInsets.symmetric(horizontal: 10,vertical: 0),
child: DropdownButtonFormField(
value: drugName,
decoration: InputDecoration(
labelText: 'Medicine',
labelStyle: poppins1,
),
items: ['Paracetemol', 'Ozopin']
.map((name) =>
DropdownMenuItem(child: Text('$name'), value: name))
.toList(),
onChanged: (val) {
setState(() {
drugName = val;
});
},
),
),
Padding(
padding: const EdgeInsets.symmetric(horizontal: 10,vertical: 0),
child: DropdownButtonFormField(
value: drugForm,
decoration: InputDecoration(
labelText: 'Form',
labelStyle: poppins1,
),
items: ['Tablets', 'Pills']
.map((form) =>
DropdownMenuItem(child: Text('$form'), value: form))
.toList(),
onChanged: (val) {
setState(() {
drugForm = val;
});
},
),
),
Padding(
padding: const EdgeInsets.symmetric(horizontal: 10,vertical: 0),
child: Column(
children: [
GestureDetector(
onTap: () {
showAlert(
['100 mg', '200 mg', '500 mg'], drugPower,
(list) {
drugPower.clear();
drugPower = list;
});
},
child: Container(
width: double.infinity,
height: 70,
padding: EdgeInsets.only(
top: 15,
),
margin: EdgeInsets.only(top: 15),
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Text(
'Power',
style: poppins1,
),
Row(
mainAxisAlignment:
MainAxisAlignment.spaceBetween,
crossAxisAlignment:
CrossAxisAlignment.end,
children: [
Text(drugPower.length > 0
? drugPower[0]
: ''),
Icon(Icons.arrow_drop_down)
],
),
]),
decoration: BoxDecoration(
border: Border(
bottom:
BorderSide(width: 1, color: color2))),
),
),
SizedBox(
height: 10,
),
Wrap(
children: displayChips(drugPower),
),
],
),
),
下面是作为弹出对话框的标签选择器代码
showAlert(List<String> tags, List<String> finalTags,
Function(List<String>) onSelectionChanged) {
showDialog(
context: context,
builder: (BuildContext context) {
return AlertDialog(
title: Text('Select Power'),
content: Wrap(
children: [
for (int i = 0; i < tags.length; i++)
Container(
padding: EdgeInsets.all(10),
child: OutlinedButton(
style: ButtonStyle(
backgroundColor: MaterialStateProperty.all(
finalTags.contains(tags[i])
? Colors.blue[400]
: Colors.white)),
onPressed: () {
setState(() {
finalTags.contains(tags[i])
? finalTags.remove(tags[i])
: finalTags.add(tags[i]);
onSelectionChanged(finalTags);
Navigator.of(context).pop();
showAlert(tags, finalTags, (list) {
finalTags = list;
});
});
},
child: Text(
tags[i],
style: TextStyle(
color: drugPower.contains(tags[i])
? Colors.white
: Colors.black),
)),
)
],
),
actions: [
ElevatedButton(
onPressed: () => Navigator.of(context).pop(),
child: Text(
'save',
style: TextStyle(backgroundColor: color4),
),
style: ElevatedButton.styleFrom(
primary: color4,
onPrimary: color5,
padding:
EdgeInsets.symmetric(vertical: 10.0, horizontal: 30.0),
),
)
],
);
});
}
现在,当我在选择了 3 个小部件值后单击保存按钮时,我正在存储如下值
saveDrug() {
var list = [
drugName,
drugForm,
drugPower
];
setState(() {
drugList.add(list);
});
}
当我向 druglist 添加一个迭代值时,它工作正常,但是当我向 druglist 添加两个或多个迭代时,所有迭代(在 druglist 中)的 drugpower 值都是相同的。我该如何解决这个问题,以便每次迭代都基于我选择的 drugpower 标签?
下面是我的小部件设置的视频链接 https://imgur.com/a/f2DJwZ3
解决方案
我怀疑你的引用有问题,
把你saveDrug
改成这个,
saveDrug() {
setState(() {
drugList = [
...drugList,
[drugName, drugForm, drugPower]
];
// After we add one drug, we dont need the old values, so just erase them
drugName = null;
drugForm = null;
drugPower = [];
});
}
现在,您drugList
应该可以正常更新了。
这是添加3次后的结果,
我以这样的方式显示结果Column
,因为您没有提供代码,
Column(
children: drugList.map((e) => Text(e.toString())).toList(),
)
推荐阅读
- bash - 如何根据bash中的日期对数据进行排序?
- racket - 带有条件语句错误的 BMI 计算器球拍
- perl - UNIX Perl - FTP:仅检索无效文件(绕过目录)
- javascript - Vue Jest 测试问题:TypeError: Super expression must be null or a function, not undefined
- json - Apollo 客户端 GraphQL 查询:JSON 输入意外结束
- rust - 为什么 Rust 的 .expect() 被称为 expect?
- r - 如何翻译包含多个“_”的变量名中的最后一个“_”?
- python - 如何用多个 .txt 文件中的其他内容替换行的特定第一个字符?(Python)
- amazon-web-services - Ember 应用程序进入 AWS S3 存储桶
- c# - 连接后停止使用sql数据库 - c#