首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何解决这个响应类型'({bool growable}) => List<DropdownMenuItem<dynamic>>‘不是’List<DropdownMenuItem<String>>‘的子类型?

如何解决这个响应类型'({bool growable}) => List<DropdownMenuItem<dynamic>>‘不是’List<DropdownMenuItem<String>>‘的子类型?
EN

Stack Overflow用户
提问于 2022-11-08 03:41:43
回答 2查看 43关注 0票数 1

我试图从API中检索数据,以显示在下拉列表中,但是出现了一个错误,我尝试根据我在google和论坛上寻找的内容进行了尝试,但问题仍然出现。我的代码写错了吗,谢谢

--这是调用api时执行的函数,响应为200。

代码语言:javascript
复制
class UtilFunction {
  String? _valMenu;
  var _dataMenu = [];

  Future getSemester() async {
    String url = Constant.baseURL;
    String token = await UtilSharedPreferences.getToken();
    final respose = await http.get(
      Uri.parse(
        '$url/auth/semester/get_smt',
      ),
      headers: {
        'Authorization': 'Bearer $token',
      },
    );
    await http
        .get(
          Uri.parse(
            '$url/auth/semester/get_smt',
          ),
        )
        .then((value) => (() {
              // respose = value; //untuk melakukan request ke webservice
              var listData =
                  jsonDecode(respose.body); //lalu kita decode hasil datanya
              _dataMenu = listData['data'];
              _valMenu = _dataMenu[0]['data'];
            }));
    print(respose.statusCode);
    print(respose.body);
    return _dataMenu;
  }
}

和我在这里接受上面的函数。

代码语言:javascript
复制
Container(
                child: FutureBuilder(
                  future: UtilFunction().getSemester(),
                  builder: (context, snapshot) {
                    if (snapshot.hasData) {
                      return Column(
                        crossAxisAlignment: CrossAxisAlignment.start,
                        children: [
                          DropdownButtonFormField(
                            value: _valMenu,
                            onChanged: (value) {},
                            items: snapshot.data
                                .map<DropdownMenuItem>(
                                    (project) => DropdownMenuItem(
                                          value: project['smt'],
                                          child: Text(project['smt']),
                                        ))
                                .toList,
                          ), ...

这个响应json

代码语言:javascript
复制
{
    "status": "success",
    "code": "200",
    "data": [
        {
            "id": "254dd6e9-791e-4a2b-959e-6ec5929f3104",
            "id_ta": "2b4d2dd1-ef8e-461b-b7c3-48409a13969e",
            "ta": "2022-2023",
            "smt": "GANJIL",
            "semester": "2022-2023 GANJIL",
            "periode_awal": "Senin, 01 Agustus 2022",
            "periode_akhir": "Minggu, 22 Januari 2023",
            "p_awal": "2022-08-01",
            "p_akhir": "2023-01-22",
            "period_smt": "Senin, 01 Agustus 2022 - Minggu, 22 Januari 2023",
            "created_at": "2022-08-10 05:02:18",
            "updated_at": "2022-09-06 03:57:00",
            "created_by": "Superadmin",
            "updated_by": "Dasep",
            "sts_hapus": 1
        }
    ]
}
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2022-11-08 11:20:42

在获取数据和如何打印数据方面存在一些问题。我使用了公共api,您可以更改url。

代码语言:javascript
复制
class UtilFunction {
  String? _valMenu;
  List<String> _dataMenu = [];

  Future getSemester() async {
    await http.get(Uri.parse("http://universities.hipolabs.com/search?country=United+States")).then((value) {
      // respose = value; //untuk melakukan request ke webservice
      var listData = jsonDecode(value.body); //lalu kita decode hasil datanya
      for (var i = 0; i < 10; i++) {
        _dataMenu.add(listData[i]["domains"][0]);
      }
      _valMenu = _dataMenu[0];
    });
    return _dataMenu;
  }
}

此外,我在FutureBuilder中做了一些修改。请注意,还需要更改api调用的返回类型,以提供下拉值的第一个元素。

代码语言:javascript
复制
FutureBuilder(
                future: UtilFunction().getSemester(),
                builder: (context, AsyncSnapshot snapshot) {
                  if (snapshot.hasData) {
                    val = snapshot.data[0];
             
                    return Column(crossAxisAlignment: CrossAxisAlignment.start, children: [
    
                      DropdownButton<String>(
                        value: val,
                        onChanged: (value) {
                          val = value!;
                        },
                        items: snapshot.data
                            .map<DropdownMenuItem<String>>((String project) => DropdownMenuItem<String>(
                                  value: project,
                                  child: Text(project),
                                ))
                            .toList(),
                      ),
                    ]);
                  } else {
                    return Text("dsds");
                  }
                })
票数 1
EN

Stack Overflow用户

发布于 2022-11-08 04:27:28

List<DropdownMenuItem>更改为List<DropdownMenuItem<String>>

代码语言:javascript
复制
                        snapshot.data
                                .map<DropdownMenuItem<String>>(
                                    (project) => DropdownMenuItem<String>(
                                          value: project['smt'],
                                          child: Text(project['smt']),
                                        ))
                                .toList()

也是在解码中试试这个

代码语言:javascript
复制
             var listData =  jsonDecode(respose.body);  as Map<String, dynamic>
             if(listData.containsKey('data')){
                   _dataMenu = listData['data'];
                  _valMenu = _dataMenu[0]['data']; 
               } else {
                 // HANDLE NO DATA SCENARIO
               } 
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/74355454

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档