Search code examples
jsondartflutterdropdownbox

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


I have a json file and contains some currency value. I use rootBundle.loadString to load my json data. Now I need to load the DropdownButton with using my jsonData. DropdownButton text must shows the json value such as "TRL”. But if I try to select any of the menu item I need to save the value like TRL_00. My dropdownbutton is not working in my code.My question is
How do I load type json file into dropdown DropdownButton?

this part is not working:

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

My son file:

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

Load json:

Map _mapCurrency;
String _currency;

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

DropDown part:

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

Solution

  • I asked other question in here How do I load my local json into List<Map> variable?. And help of Günter Zöchbauer I finally finished the steps in my project. Complete code is here.

    This my local 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()),
        );
      }
    }