Flutter使用JSON填充dropdownmenu

时间:2017-10-07 21:48:36

标签: flutter

我正在尝试从rest api返回JSON并填充dropdownmenu,我需要具有与子值不同的值。有没有人这样做或有一个例子或建议。我正在使用基本示例,似乎无法找到使用JSON而不是静态列表的方法。以下是我尝试过的,但仍然没有找到价值。我一直得到一个飞镖null错误。任何帮助都会很棒。我已经更新了如何获得JSON和解码。我尝试过几件事。这也是错误,但我已在调试中确认该值永远不为null,因此必须使用JSON。我尝试过使用静态列表并且可以正常工作。

'package:flutter/src/material/dropdown.dart': Failed assertion: line 433 pos 15: 'value == null

String _referPractice = '<New>';

JSON看起来像这样:

[{"id":0,"name":"<New>"},{"id":1,"name":"Test Practice"}]


var http = createHttpClient();
var response = await http.get(_url);
var practices = await jsonCodec.decode(response.body);
practicelist = await practices.toList();

new DropdownButton<String>(
        value: _referPractice,
        isDense: true,
        onChanged: (String newValue) {
          setState(() {
            _referPractice = newValue;
          });
        },
        items: practicelist.map((value) {
          return new DropdownMenuItem<String>(
            value: value['id'].toString(),
            child: new Text(value['name']),
          );
        }).toList(),
      ),

1 个答案:

答案 0 :(得分:2)

您收到此错误的原因是您使用_referPractice的值初始化!null,并将其提供给value的{​​{1}}的属性DropDownButton当前选定的项目,如果尚未选择任何项目,则必须为空。

我使用您提供的JSON复制了您的示例:

enter image description here

String _mySelection;
  List<Map> _myJson = [{"id":0,"name":"<New>"},{"id":1,"name":"Test Practice"}];

  @override
  Widget build(BuildContext context) {
     return new Scaffold(
        body: new Center(
          child: new DropdownButton<String>(
            isDense: true,
            hint: new Text("Select"),
            value: _mySelection,
            onChanged: (String newValue) {

              setState(() {
                _mySelection = newValue;
              });

              print (_mySelection);
            },
            items: _myJson.map((Map map) {
              return new DropdownMenuItem<String>(
                value: map["id"].toString(),
                child: new Text(
                  map["name"],
                ),
              );
            }).toList(),
          ),
        ),
      );

  }