【问题标题】:type 'List<dynamic>' is not a subtype of type 'List<DropdownMenuItem<Partner>>?'List<dynamic>' 类型不是 'List<DropdownMenuItem<Partner>> 类型的子类型?
【发布时间】:2021-11-05 09:36:22
【问题描述】:

试图在下拉列表中显示我的数据,它显示 type 'List&lt;dynamic&gt;' is not a subtype of type List&lt;DropdownMenuItem&lt;Partner&gt;&gt;? 相信它期待 List&lt;DropdownMenuItem&lt;Partner&gt;&gt; 但它得到 List&lt;dynamic&gt; 。这将是什么语法?我尝试了不同的方法,至少我可以理解。

我的 API 函数

    Future<List<Partner>> AllPathLab() async {
    var jsonResponse;
  
      var response = await http.post(Uri.parse("http://apiURLTYYYTY"),
          body: ({
            
          }));
      if (response.statusCode == 200) {
        jsonDecode(response.body);
        jsonResponse = json.decode(response.body.toString());
        print(jsonResponse);

        AllPathLabTestModel dataModel = allPathLabTestModelFromJson(response.body);
        print(dataModel.partner.length);
        for (final item in dataModel.partner) 
        print(item.partnerName);

        List<Partner> arrData = dataModel.partner; // this "partner" is actual json array of data[]
        return arrData;
      } else {
        print("Wrong URL");
        throw Exception("Faild to fetch");
      }
    
  }

然后尝试在 DropdownMenuItem 中显示。

Container(
                  child: FutureBuilder<List<Partner>>(
                    future: AllPathLab(),
                    builder:
                        (BuildContext context, AsyncSnapshot snapshot) {
                      if (snapshot.connectionState !=ConnectionState.done) {
                        return CircularProgressIndicator();
                      }
                      if (snapshot.hasError) {
                        return Text("Somthing went wrong");
                      }

                      if (snapshot.hasData) {
                        return DropdownButton<Partner>(
                          dropdownColor: Colors.white,
                  underline: SizedBox(),
                  isExpanded: true,
                  items: snapshot.data.map((Partner data) =>
                   DropdownMenuItem<Partner>(
                     child: Text("${data.partnerName}"),
                   value: data,
                   )
                    ).toList(),
                    onChanged: (value){

                    });
                        
                      }
                      return Text("Waiting for Internet Connection");
                    },
                  ),
                ),

我的模型课

    class AllPathLabTestModel {
    AllPathLabTestModel({
        required this.status,
        required this.message,
        required this.partner,
    });

    String status;
    String message;
    List<Partner> partner;

    factory AllPathLabTestModel.fromJson(Map<String, dynamic> json) => AllPathLabTestModel(
        status: json["Status"],
        message: json["Message"],
        partner: List<Partner>.from(json["Partner"].map((x) => Partner.fromJson(x))),
    );

    Map<String, dynamic> toJson() => {
        "Status": status,
        "Message": message,
        "Partner": List<dynamic>.from(partner.map((x) => x.toJson())),
    };
}

class Partner {
    Partner({
        required this.encPartnerId,
        required this.partnerName,
    });

    String encPartnerId;
    String partnerName;

    factory Partner.fromJson(Map<String, dynamic> json) => Partner(
        encPartnerId: json["EncPartnerId"],
        partnerName: json["PartnerName"] == null ? null : json["PartnerName"],
    );

    Map<String, dynamic> toJson() => {
        "EncPartnerId": encPartnerId,
        "PartnerName": partnerName == null ? null : partnerName,
    };
}

【问题讨论】:

  • 尝试通过以下方式进行投射:DropdownMenuItem(child: Text("${data.partnerName}"), value: data, )).toList().cast >( )
  • 哇..终于!!!它的工作,但选择项目后它不显示选定的项目名称。为什么 ?有什么建议吗?
  • 是的,这是因为你没有设置一个值......你应该这样做: return DropdownButton( value: _val,... onChanged: (value){ setState ({_val=value;}) });
  • 所以你必须创建一个传递给下拉列表的变量......在我的例子中我称之为_val

标签: json flutter api dart


【解决方案1】:

我尝试删除未来的构建器并使用虚拟对象进行测试
您需要为合作伙伴创建对象,并且在 onChanged 中您需要将其设置为值

Partner partner;
List<Partner> pl = [
 Partner(encPartnerId: '1', partnerName: 'a'),
 Partner(encPartnerId: '2', partnerName: 'b')
];


//Dropdown
DropdownButton<Partner>(
        dropdownColor: Colors.white,
        isExpanded: true,
        value: partner,
        items: pl
            .map<DropdownMenuItem<Partner>>(
              (Partner data) => DropdownMenuItem<Partner>(
                child: Text("${data.partnerName}"),
                value: data,
              ),
            )
            .toList(),
        onChanged: (value) {
          setState(() {
            partner = value;
          });
        })

【讨论】:

  • 您好,需要您的帮助,我已被禁止回答,如果解决了您的问题,请点赞或接受,谢谢
  • 这实际上对我没有帮助,但是对于可能从本地 Json 文件中获取的人可能会有所帮助,所以我接受它... ;) 感谢您的宝贵时间
猜你喜欢
  • 1970-01-01
  • 2019-11-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-12-29
  • 2023-01-08
  • 2021-06-24
  • 2021-07-06
相关资源
最近更新 更多