期望类型为“List<DropdownMenuItem<Project$>>?”的值,但得到类型为“List<dynamic>”的值

时间:2021-02-26 16:42:25

标签: flutter dart

我正在尝试在 FutureBuilder 中构建 Project 列表的下拉按钮,但收到错误:

Expected a value of type 'List<DropdownMenuItem<Project$>>?', but got one of type 'List<dynamic>'

我了解错误及其发生的位置,但我不明白为什么它不会返回 List<DropdownMenuItem>,所以我似乎无法弄清楚如何在 Dart 中修复它。

违规代码:

@override
  Widget build(BuildContext context) {
    return FutureBuilder(
      future: _futureProjects,
      builder: (BuildContext context, AsyncSnapshot snapshot) {
        if (snapshot.hasData) {
          return Column(children: [   
            Text('Project:'),
            new DropdownButton<Project>(
              value: _selectedProject,
              items: snapshot.data
                  .map((value) => new DropdownMenuItem<String>(
                        value: value.name,
                        child: Text(value.name),
                      ))
                  .toList(),
            ),
        } else {
          // ...

_futureProjects 通过 http:

填充
Future<List<Project>> getJiraProjectsList() async {
    final response = await http.get(url + 'jira/projects');

    if (response.statusCode == 200) {
      var jsonData = jsonDecode(response.body);
      List<Project> projects = [];

      for(var data in jsonData){
        Project proj = Project.fromJson(data);
        projects.add(proj);
      }

      return projects;
    } else {
      throw Exception('Failed to load Projects List');
    }
  }

如果能帮助我解决这个问题,我将不胜感激

1 个答案:

答案 0 :(得分:0)

您可以在以下示例中使用 AsyncSnapshot<List<Project>>DropdownMenuItem<Project>

FutureBuilder(
    future: _futureProjects,
    builder: (BuildContext context, AsyncSnapshot<List<Project>> snapshot) {
      if (snapshot.hasData) {
        return Column(children: [
          Text('Project:'),
          DropdownButton<Project>(
            value: snapshot.data[0],
            onChanged: (value) {},
            items: snapshot.data
                .map((project) => DropdownMenuItem<Project>(
                      value: project,
                      child: Text(project.name),
                    ))
                .toList(),
          ),
        ]);
      } else {
        return Text('... waiting');
      }
    })