Как мне загрузитьвведите файл json в DropdownButton - PullRequest
0 голосов
/ 08 ноября 2018

У меня есть файл JSON, и он содержит некоторую стоимость валюты. Я использую rootBundle.loadString для загрузки моих данных JSON. Теперь мне нужно загрузить DropdownButton, используя мои jsonData. Текст DropdownButton должен отображать значение json, например «TRL». Но если я пытаюсь выбрать какой-либо пункт меню, мне нужно сохранить значение, например TRL_00. Моя выпадающая кнопка не работает в моем коде. Мой вопрос
Как загрузить файл типа 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);

DropDown часть:

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…’;
  },
),

1 Ответ

0 голосов
/ 09 ноября 2018

Я задал другой вопрос здесь Как загрузить локальный json в переменную List

. И с помощью Гюнтера Цохбауэра я наконец-то завершил этапы своего проекта. Полный код здесь.

Это мой местный 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()),
    );
  }
}
...