【问题标题】:Flutter: How to map a Dictionary? Make dropdown options via dictionaryFlutter:如何映射字典?通过字典制作下拉选项
【发布时间】:2019-12-01 03:32:42
【问题描述】:

我需要一些关于颤振数据映射的帮助。我有一个返回一些字段的 JSON 对象。我必须根据这些字段创建一个表单。我现在面临的问题是我无法将 JSON 字典映射到我的下拉列表。

所以基本上我想在我的 json 的 form_field_options 中创建一个下拉选项。

这是我尝试激活的代码示例,我的服务器返回的 JSON 是:

{
"status": "200",
"request": "0",
"message": "Success",
"data": {
    "assetID": "155",
    "assetTitle": "TPO",
    "formTitle": "Roof Asset",
    "preFields": [
        {
            "unique_id": "uid_201955451258",
            "form_name": "General Overview",
            "form_field_type": "100",
            "form_field_required": "0",
            "form_field_private": "0",
            "form_field_duplicate_times": "00",
            "form_field_disabledrow": "0"
        },
        {
            "unique_id": "uid_201939764918",
            "form_name": "Asset ID",
            "form_field_type": "5",
            "form_field_required": "1",
            "form_field_private": "0",
            "form_field_duplicate_times": "00",
            "form_field_disabledrow": "0"
        },
        {
            "unique_id": "uid_201789014253",
            "form_name": "Facility ID",
            "form_field_type": "5",
            "form_field_required": "0",
            "form_field_private": "0",
            "form_field_duplicate_times": "00",
            "form_field_disabledrow": "0"
        },
        {
            "unique_id": "uid_201996716360",
            "form_name": "Location",
            "form_field_type": "19",
            "form_field_required": "0",
            "form_field_private": "0",
            "form_field_duplicate_times": "00",
            "form_field_disabledrow": "0"
        },
        {
            "unique_id": "uid_201941758250",
            "form_name": "Developed Area Type",
            "form_field_type": "1",
            "form_field_required": "0",
            "form_field_private": "0",
            "form_field_duplicate_times": "00",
            "form_field_options": {
                "1": {
                    "opt_name": "Suburban",
                    "opt_weightage": ""
                },
                "2": {
                    "opt_name": "Urban",
                    "opt_weightage": ""
                },
                "3": {
                    "opt_name": "Rural",
                    "opt_weightage": ""
                }
            },
            "form_field_disabledrow": "0"
        }
    ]
}
}

这是我的表单类(自动生成类表单快速类型)是:

        // To parse this JSON data, do
    //
    //     final form = formFromJson(jsonString);

    import 'dart:convert';

    Form formFromJson(String str) => Form.fromJson(json.decode(str));

    String formToJson(Form data) => json.encode(data.toJson());

    class Form {
        String status;
        String request;
        String message;
        Data data;

        Form({
            this.status,
            this.request,
            this.message,
            this.data,
        });

        factory Form.fromJson(Map<String, dynamic> json) => new Form(
            status: json["status"],
            request: json["request"],
            message: json["message"],
            data: Data.fromJson(json["data"]),
        );

        Map<String, dynamic> toJson() => {
            "status": status,
            "request": request,
            "message": message,
            "data": data.toJson(),
        };
    }

    class Data {
        String assetId;
        String assetTitle;
        String formTitle;
        List<PreField> preFields;

        Data({
            this.assetId,
            this.assetTitle,
            this.formTitle,
            this.preFields,
        });

        factory Data.fromJson(Map<String, dynamic> json) => new Data(
            assetId: json["assetID"],
            assetTitle: json["assetTitle"],
            formTitle: json["formTitle"],
            preFields: new List<PreField>.from(json["preFields"].map((x) => PreField.fromJson(x))),
        );

        Map<String, dynamic> toJson() => {
            "assetID": assetId,
            "assetTitle": assetTitle,
            "formTitle": formTitle,
            "preFields": new List<dynamic>.from(preFields.map((x) => x.toJson())),
        };
    }

    class PreField {
        String uniqueId;
        String formName;
        String formFieldType;
        String formFieldRequired;
        String formFieldPrivate;
        String formFieldDuplicateTimes;
        String formFieldDisabledrow;
        Map<String, FormFieldOption> formFieldOptions;

        PreField({
            this.uniqueId,
            this.formName,
            this.formFieldType,
            this.formFieldRequired,
            this.formFieldPrivate,
            this.formFieldDuplicateTimes,
            this.formFieldDisabledrow,
            this.formFieldOptions,
        });

        factory PreField.fromJson(Map<String, dynamic> json) => new PreField(
            uniqueId: json["unique_id"],
            formName: json["form_name"],
            formFieldType: json["form_field_type"],
            formFieldRequired: json["form_field_required"],
            formFieldPrivate: json["form_field_private"],
            formFieldDuplicateTimes: json["form_field_duplicate_times"],
            formFieldDisabledrow: json["form_field_disabledrow"],
            formFieldOptions: json["form_field_options"] == null ? null : new Map.from(json["form_field_options"]).map((k, v) => new MapEntry<String, FormFieldOption>(k, FormFieldOption.fromJson(v))),
        );

        Map<String, dynamic> toJson() => {
            "unique_id": uniqueId,
            "form_name": formName,
            "form_field_type": formFieldType,
            "form_field_required": formFieldRequired,
            "form_field_private": formFieldPrivate,
            "form_field_duplicate_times": formFieldDuplicateTimes,
            "form_field_disabledrow": formFieldDisabledrow,
            "form_field_options": formFieldOptions == null ? null : new Map.from(formFieldOptions).map((k, v) => new MapEntry<String, dynamic>(k, v.toJson())),
        };
    }

    class FormFieldOption {
        String optName;
        String optWeightage;

        FormFieldOption({
            this.optName,
            this.optWeightage,
        });

        factory FormFieldOption.fromJson(Map<String, dynamic> json) => new FormFieldOption(
            optName: json["opt_name"],
            optWeightage: json["opt_weightage"],
        );

        Map<String, dynamic> toJson() => {
            "opt_name": optName,
            "opt_weightage": optWeightage,
        };
    }  



现在,当我尝试在我的选项列表(如果它的列表完美运行)上应用循环或映射时,它不会映射它:




    Column(
                              children: <Widget>[
                                FormBuilderDropdown(
                                  attribute: item.uniqueId,
                                  decoration:
                                      InputDecoration(labelText: item.formName),
                                  // initialValue: 'Male',
                                  hint: Text(item.formName),
                                  // validators: [
                                  //   FormBuilderValidators.required()
                                  // ],
                                  items: item.formFieldOptions.map((option) => DropdownMenuItem(
                                          value: option,
                                          child: Text("$option.optName")))
                                      .toList(),
                                ),
                              ],
                            ),


它给我带来了错误:



> The argument type '(String) → MapEntry<?, ?>' can't be assigned to the
> parameter type '(String, FormFieldOption) → MapEntry<dynamic,
> dynamic>'.dart(argument_type_not_assignable)

请帮助或让我知道我做错了什么。我怎样才能使这些下拉选项。

提前致谢


【问题讨论】:

    标签: json flutter dart json-deserialization mapping


    【解决方案1】:

    您应该尝试使用正确的 lambda 签名 (k, v) =&gt; 进行映射

    items: item.formFieldOptions.map((key, option) => DropdownMenuItem(
              value: key,
              child: Text("${option.optName}"),
            )
           ).toList()
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-06-10
      • 2021-08-02
      相关资源
      最近更新 更多