AutoCompleteTextField не показывает колебания данных json

#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 ?