#flutter #dart #flutter-layout #flutter-dependencies
#сбой #dart #сбой-макет #сбой-зависимости
Вопрос:
Здесь я пытаюсь отобразить все названия коллажей в текстовом поле через json, и я не знаю, почему он не показывает мне данные списка allcollagename, которые отображаются в моей консоли отладки, но они не видны в AutoCompleteTextField
вот api, который я использую для извлечения данных для имен коллажей
var api = 'http://universities.hipolabs.com/search';
вот моя функция выборки данных.
fetchData() async {
try {
var res = await http.get(api);
var data = jsonDecode(res.body);
List<CollageName> collageNameList = data.map<CollageName>((sup) {
return CollageName.fromJson(sup);
}).toList();
allCollageList = collageNameList;
return allCollageList;
} catch (err) {
return Future.error("Connection Error Restart App");
}
}
я вызываю эту функцию выборки данных в initState
и вот мой код для AutoCompleteTextField
Container(
child: AutoCompleteTextField(
key: key,
controller: _suggetionTextFieldController,
suggestions: allCollageList,
clearOnSubmit: false,
style: TextStyle(fontSize: 10),
itemFilter: (item, query) {
return item.name
.toLowerCase()
.startsWith(query.toLowerCase());
},
itemSorter: (a, b) {
return a.name.compareTo(b.name);
},
itemSubmitted: (item) {
_suggetionTextFieldController.text = item.name;
},
itemBuilder: (context, item) {
return Container(
child: Text(item.name),
);
})),
CollageName (класс модели)
class CollageName {
String country;
String stateProvince;
String name;
List<dynamic> webPages;
List<dynamic> domains;
String alphaTwoCode;
CollageName(
{this.country,
this.stateProvince,
this.name,
this.webPages,
this.domains,
this.alphaTwoCode});
CollageName.fromJson(Map<String, dynamic> json) {
country = json['country'] ?? "ohh bhai tu fir aa gaya";
stateProvince = json['state-province'];
name = json['name'] ?? "ohh bhai tu fir aa gaya";
webPages = json['web_pages'].cast<String>();
domains = json['domains'].cast<String>();
alphaTwoCode = json['alpha_two_code'] ?? "ohh Bhai";
}
Map<String, dynamic> toJson() {
final Map<String, dynamic> data = new Map<String, dynamic>();
data['country'] = this.country;
data['state-province'] = this.stateProvince;
data['name'] = this.name;
data['web_pages'] = this.webPages;
data['domains'] = this.domains;
data['alpha_two_code'] = this.alphaTwoCode;
return data;
}
}
состояние инициализации
@override
void initState() {
super.initState();
fetchData();
print(allCollageList.toString());
}
Ответ №1:
Внесите несколько изменений в свой fetchData()
метод
fetchData() async {
try {
var res = await http.get(api);
var data = jsonDecode(res.body);
List<CollageName> collageNameList = data.map<CollageName>((sup) {
return CollageName.fromJson(sup);
}).toList();
// added these 3 lines also, notice that I have used .addAll() method instead of using the assignment operator
setState(() {
allCollageList.addAll(collageNameList);
});
} catch (err) {
return Future.error("Connection Error Restart App: " err);
}
}
Ответ №2:
Я думаю, что вы пропустили setState
после установки переменной.
Попробуйте что-то вроде этого,
fetchData() async {
try {
var res = await http.get(api);
var data = jsonDecode(res.body);
List<CollageName> collageNameList = data.map<CollageName>((sup) {
return CollageName.fromJson(sup);
}).toList();
setState((){ allCollageList = collageNameList });
} catch (err) {
return Future.error("Connection Error Restart App");
}
}
а также в вашей fromJson
реализации. Он должен возвращать экземпляры.
factory CollageName.fromJson(Map<String, dynamic> json) {
return CollageName(
country : json['country'] ?? "ohh bhai tu fir aa gaya",
stateProvince : json['state-province'],
name : json['name'] ?? "ohh bhai tu fir aa gaya",
webPages : json['web_pages'],
domains : json['domains'],
alphaTwoCode : json['alpha_two_code'] ?? "ohh Bhai"
);
}
Надеюсь, это сработает!
Комментарии:
1. Можете ли вы опубликовать полный код или
initState
иCollageName
?