В моем приложении флаттера мне нужно создать 3 кнопки выпадающего меню.У меня есть локальный файл Json, в котором есть список компаний из разных стран.
Запросы:
- Первая выпадающая кнопка загружает названия компаний ( bAd ).
- Вторая раскрывающаяся кнопка загружает филиалы компании ( sAd ), выбранные в первой раскрывающейся кнопке
- Третья раскрывающаяся кнопка загружает код 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) как список); строка