Flutter: получение экземпляра «Состояний» при фильтрации данных json

#flutter #dart

#флаттер #дротик

Вопрос:

Я пытаюсь декодировать данные json и фильтровать их на основе ввода пользователя в textformfield.

Мой класс модели

 class States{
  String name;
  String abbreviation;
  States({this.name, this.abbreviation});

  factory States.fromJson(Map<String,dynamic> json){
    return States(
      name: json['name'],
      abbreviation: json['abbreviation']
    );
  }
}
 

загрузка моего файла ресурсов json,

 Future loadData() async {
return await rootBundle.loadString('assets/json/states.json');}
 

мои данные json выглядят следующим образом,

 [
{
    "name": "Alabama",
    "abbreviation": "AL"
},
{
    "name": "Alaska",
    "abbreviation": "AK"
},]
 

функция, в которой я пытаюсь ее отфильтровать,

 Future<void> search(String text) async {
String jsonString = await loadData();
var data = jsonDecode(jsonString);
List<States> states = data.map<States>((value) {
  return States.fromJson(value);
}).toList();
if (textEditingController.text == null ||
    textEditingController.text.isEmpty) {
  streamController.add(null);
  return;
} else {
  streamController.sink.add(states
      .where((element) =>
          element.name.toLowerCase().startsWith(text.toLowerCase())) 
      .toList());
}
 

}

Как я пытаюсь это показать,

 Container(
              child: StreamBuilder(
                stream: stream,
                builder: (context, snapshot) {
                  if (!snapshot.hasData) {
                    return all(context);
                  } else if (snapshot.connectionState == "waiting") {
                    return CircularProgressIndicator();
                  } else {
                    return ListView.builder(
                        shrinkWrap: true,
                        itemCount: snapshot.data.length,
                        itemBuilder: (context, index) {
                          return ListTile(
                            title: Text('${snapshot.data[index]}'), //<--- here
                          );
                        });
                  }
                },
              ),
            )
 

он отображается как Instace «Состояний» в текстовом виджете.

Комментарии:

1. @pskink спасибо за комментарий, я делаю это в функции search () моя проблема в том, что когда я использую предложение where, оно показывает экземпляр «состояний», но выполняет фильтрацию, но показывает, что это моя проблема.

2. @pskink о, чувак, спасибо, это сработало. можете ли вы сказать мне, что здесь не так? и я следил за статьей и запросом стека, и мне никогда не приходило в голову, что это будет проблемой, которую я ломал голову со вчерашнего дня. еще раз спасибо

Ответ №1:

Ответ был прост, как сказал @pskink, мне просто нужно было это сделать

Текст (снимок.данные [индекс].имя)

вместо этого

Текст (‘${снимок.данные [индекс]}’)