如何将 <?, ?> type json 文件加载到 DropdownButton

How do I load <?, ?> type json file into DropdownButton

我有一个 json 文件,其中包含一些货币值。我使用 rootBundle.loadString 加载我的 json 数据。 现在我需要使用我的 jsonData 加载 DropdownButton。 DropdownButton 文本必须显示 json 值,例如“TRL”。但是如果我尝试 select 任何菜单项,我需要保存 TRL_00 之类的值。我的下拉按钮不起作用我的 code.My 问题是
如何将 json 类型的文件加载到下拉 DropdownButton 中?

这部分不工作:

items: _mapCurrency((String value) {
            return new DropdownMenuItem<String>(
              value: value,
              child: new Text(value),
            );
          }).toList(),

我儿子档案:

{
  "00": "TRL",
  "01": "USD",
  “02”: "GBP",
  “03”: "EUR"
}

加载json:

Map _mapCurrency;
String _currency;

String jsonCurrency =
await rootBundle.loadString("packages/currencies.json");
_mapCurrency = json.decode(jsonCurrency);

下拉部分:

new FormField<String>(
  builder: (FormFieldState<String> state) {
    return InputDecorator(
      decoration: InputDecoration(
        labelText: ‘Currency’,
        labelStyle: TextStyle(
            fontSize: 18.0,
            fontWeight: FontWeight.bold,
            color: Colors.green.shade700),
        errorText: state.hasError ? state.errorText : null,
      ),
      isEmpty: _currency == '',
      child: new DropdownButtonHideUnderline(
        child: new DropdownButton<String>(
          style: TextStyle(
            fontSize: 18.0,
            color: Colors.black,
            fontWeight: FontWeight.w500,
          ),
          value: _currency,
          isDense: true,
          onChanged: (String newValue) {
            setState(() {
              _currency = newValue;
              state.didChange(newValue);
            });
          },
          items: _mapCurrency((String value) {
            return new DropdownMenuItem<String>(
              value: value,
              child: new Text(value),
            );
          }).toList(),
        ),
      ),
    );
  },
  validator: (val) {
    return val != '' ? null : ‘Choose a Currency…’;
  },
),

我在这里问了其他问题 。在 Günter Zöchbauer 的帮助下,我终于完成了项目中的步骤。完整代码在这里。

这是我的本地 json。

[
  {“id”: 00”, “name”: ”TRL”},
  {“id”: 01”, “name”: ”USD”},
  {“id”: 02”, “name”: ”GBP”},
  {“id”: 03”, “name”: ”EUR”},
]




class _MyHomePageState extends State<MyHomePage> {
  final GlobalKey<ScaffoldState> _scaffoldKey = new GlobalKey<ScaffoldState>();
  final GlobalKey<FormState> _formKey = new GlobalKey<FormState>();

  String _mySelectedCurrency;
  List<Map> _myCurrencies;

  @override
  void initState() {
    // TODO: implement initState
    super.initState();
    _loadLocalJsonData();
  }

  Future _loadLocalJsonData() async {
    String jsonCurrency = await rootBundle
        .loadString("packages/capi/tcbank.json");
    setState(() {
      _myCurrencies = List<Map>.from(jsonDecode(jsonCurrency) as List);
      print("*******_myCurrencies: $_myCurrencies");
    });
  }

  @override
  Widget build(BuildContext context) {
    return _myCurrencies == null ? _buildWait(context) : _buildRun(context);
  }

  // TODO: BUILD RUN
  Widget _buildRun(BuildContext context) {
    final _itemsName = _myCurrencies.map((c) {
      return new DropdownMenuItem<String>(
        value: c["id"].toString(),
        child: new Text(c["name"].toString()),
      );
    }).toList();

    return new Scaffold(
        key: _scaffoldKey,
        body: new SafeArea(
            top: false,
            bottom: false,
            child: new Form(
                key: _formKey,
                child: new ListView(
                  padding: const EdgeInsets.symmetric(
                      horizontal: 16.0, vertical: 32.0),
                  children: <Widget>[
                    //TODO: CURRENCY #########################
                    new FormField<String>(
                      builder: (FormFieldState<String> state) {
                        return InputDecorator(
                          decoration: InputDecoration(
                            labelText: 'CHOOSE CURRENCY',
                            labelStyle: TextStyle(
                                fontSize: 18.0,
                                fontWeight: FontWeight.bold,
                                color: Colors.green.shade700),
                            errorText: state.hasError ? state.errorText : null,
                          ),
                          isEmpty: _mySelectedCurrency == '',
                          child: new DropdownButtonHideUnderline(
                            child: new DropdownButton<String>(
                              isExpanded: true,
                              style: TextStyle(
                                fontSize: 14.0,
                                color: Colors.black,
                                fontWeight: FontWeight.w500,
                              ),
                              value: _mySelectedCurrency,
                              isDense: true,
                              onChanged: (String newValue) {
                                setState(() {
                                  _mySelectedCurrency = newValue;
                                  state.didChange(newValue);
                                });
                              },
                              items: _itemsName,
                            ),
                          ),
                        );
                      },
                      validator: (val) {
                        return val != '' ? null : 'Choose Currency...';
                      },
                    ),
                  ],
                ))));
  }

  // TODO: BUILD WAIT
  Widget _buildWait(BuildContext context) {
    return new Scaffold(
      body: new Center(child: CircularProgressIndicator()),
    );
  }
}