Как загрузить выпадающую кнопку Flutter по запросу json? - PullRequest
0 голосов
/ 16 ноября 2018

В моем приложении флаттера мне нужно создать 3 кнопки выпадающего меню.У меня есть локальный файл Json, в котором есть список компаний из разных стран.

Запросы:

  1. Первая выпадающая кнопка загружает названия компаний ( bAd ).
  2. Вторая раскрывающаяся кнопка загружает филиалы компании ( sAd ), выбранные в первой раскрывающейся кнопке
  3. Третья раскрывающаяся кнопка загружает код sIlKd , которыйвыбрано во Второй выпадающей кнопке.

Я знаю, как загрузить локальный JSON.Также я знаю, как сделать выпадающую кнопку.Но я не знаю, как загрузить все 3 кнопки раскрывающегося списка на основе 3 запросов, которые я пытаюсь объяснить выше.

Как загрузить раскрывающуюся кнопку флаттера на основе запроса сына?

    {
   "companiesList":{
      "companyBranch":[
         {
            "company":{
               "bKd":"0001",
               "bAd":"Comany_A",
               "bIlAd":"England"
            },
            "branches":[
               {
                  "bKd":"0001",
                  "sKd":"00001",
                  "sAd":"London",
                  "sIlKd":"006"
               },
               ......
            ]
         },
         {
            "company":{
               "bKd":"0004",
               "bAd":"company_B",
               "bIlAd":"Germany"
            },
            "branches":[
               {
                  "bKd":"0004",
                  "sKd":"90001",
                  "sAd":"Berlin",
                  "sIlKd":"999"
               },
               ......
            ]
         }
      ]
   }
}

В initState я вызываю future для загрузки json, а затем использую другое future для загрузки элементов, как показано ниже.И я использую itemsComanyNames для загрузки выпадающего списка.

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

  bool _autoValidate = false;
  bool jsonLoad = false;
  List<Map> _myCompanies;
  String _myCompany;

  // TODO: (1) - initState
  @override
  void initState() {
    super.initState();
    loadJson();
  }

  Future loadJson() async {
    String jsonAccount = await rootBundle
        .loadString("packages/niyazi_fixdropdown/company.json");
    setState(() {
      _myCompanies = List<Map>.from(jsonDecode(jsonAccount) as List);
      jsonLoad = true;
    });
  }

  @override
  Widget build(BuildContext context) {
    return jsonLoad != true
        ? new Scaffold(body: new Center(child: new CircularProgressIndicator()))
        : new Scaffold(
            appBar: new AppBar(
              title: new Text(widget.title),
            ),
            body: new SafeArea(
                top: false,
                bottom: false,
                child: new Form(
                    key: _formKey,
                    autovalidate: _autoValidate,
                    child: new ListView(
                      padding: const EdgeInsets.symmetric(horizontal: 16.0),
                      children: <Widget>[
                        new FormField<String>(
                          builder: (FormFieldState<String> state) {
                            return new DropdownButton(
                                value: _myCompany,
                                isDense: false,
                                items: _myCompanies((c) {
                                  return new DropdownMenuItem(
                                    value:
                                        "${c["bAd"].toString()}",
                                    child: new Text(
                                      "${c["bAd"].toString()}",
                                      maxLines: 2,
                                      softWrap: true,
                                      style: new TextStyle(
                                        fontSize: 18.0,
                                        color: Colors.black,
                                        fontWeight: FontWeight.w500,
                                      ),
                                    ),
                                  );
                                }).toList(),
                                hint: new Text(“Choose a Company…”,
                                    maxLines: 1,
                                    softWrap: true,
                                    style: new TextStyle(
                                      fontSize: 18.0,
                                      color: Colors.red.shade700,
                                      fontWeight: FontWeight.w500,
                                    )),
                                onChanged: (String value) {
                                  // ???????????
                                  // ???????????
                                });
                          },
                        ),
                        new Container(
                            padding:
                                const EdgeInsets.only(left: 40.0, top: 20.0),
                            child: new RaisedButton(
                              child: const Text('Submit'),
                              onPressed: null,
                            )),
                      ],
                    ))),
          );
  }
}

Update-1: Я получаю сообщение об ошибке в строке _myCompanies.map ((c) как )NoSuchMethodError : метод 'map' был вызван с нулевым значением.

Update-2: новая ошибка: _InternalLinkedHashMap 'не является подтипом типа' List 'в типе, приведенном к _myCompanies= List.from (jsonDecode (jsonAccount) как список); строка

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...