首页 > 解决方案 > 如何在颤振中使用地图来解决我遇到的问题

问题描述

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

标签: flutterdart

解决方案


我怀疑你的引用有问题,

把你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(),
)

推荐阅读