SearchDelagate отображает повторяющиеся результаты

#flutter #flutter-layout #flutter-dependencies

Вопрос:

я использую делегат поиска для реализации функции поиска. Используя API для извлечения данных, все, кажется, работает нормально, проблема только в том, что каждый раз, когда я печатаю письмо, список, кажется, перестраивается и показывает дубликат результата.

Ниже приведен код класса делегата поиска. введите описание изображения здесь

Вся ваша помощь будет очень полезна. Заранее спасибо.

   class SearchBar extends SearchDelegate {
  List<LeadModel> names = [];
  List recentSearch = [];

  getNames() async {
    http
        .get(
      Uri.https('jsonplaceholder.typicode.com', 'users'),
    )
        .then((data) {
      return json.decode(data.body);
    }).then((data) {
      for (var json in data) {
        names.add(LeadModel.fromJson(json));
      }
      print(names.length);
    }).catchError((e) {
      print(e);
    });
  }

  @override
  List<Widget> buildActions(BuildContext context) {
    return [
      IconButton(
          onPressed: () {
            query = '';
          },
          icon: Icon(Icons.clear))
    ];
  }

  @override
  Widget buildLeading(BuildContext context) {
    return IconButton(
        onPressed: () {
          close(context, '');
        },
        icon: Icon(Icons.arrow_back));
  }

  @override
  Widget buildResults(BuildContext context) {
    return Container();
  }

  @override
  Widget buildSuggestions(BuildContext context) {
    final suggestions = names.where((name) {
      return name.name.toLowerCase().contains(query.toLowerCase());
    });
    return FutureBuilder(
      future: getNames(),
      builder: (context, snapshot) {
        if (query.isEmpty) return Center(child: Text(""));
        switch (snapshot.connectionState) {
          case ConnectionState.waiting:
            return Center(child: Text(""));
          default:
            if (snapshot.hasError) {
              return Center(child: Text(""));
            } else {
              names.clear();
              return ListView.builder(
                itemCount: suggestions.length,
                itemBuilder: (context, i) {
                  return ListTile(
                    title: Text(suggestions.elementAt(i).name),
                  );
                },
              );
            }
        }
      },
    );
  }
}
 

Ответ №1:

В ваших функциях GetNames очистите список names , прежде чем добавлять в него элементы, например:

 getNames() async {
   
   names.clear();
   
   await http
        .get(
      Uri.https('jsonplaceholder.typicode.com', 'users'),
    )
 

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

1. при этом количество списков сбрасывается обратно до 10, но результаты поиска не отображаются.

2. добавьте ожидание раньше http.get .

3. Добро пожаловать, пожалуйста, подумайте о том, чтобы отметить это как ответ на ваш вопрос, спасибо!

Ответ №2:

исправлено с помощью @Huthaifa Muayyad, рабочий код

 class SearchBar extends SearchDelegate {
  List<LeadModel> names = [];
  List recentSearch = [];

  getNames() async {
    names.clear();
    await http
        .get(
      Uri.https('jsonplaceholder.typicode.com', 'users'),
    )
        .then((data) {
      return json.decode(data.body);
    }).then((data) {
      for (var json in data) {
        names.add(LeadModel.fromJson(json));
      }
      print(names.length);
    }).catchError((e) {
      print(e);
    });
  }

  @override
  List<Widget> buildActions(BuildContext context) {
    return [
      IconButton(
          onPressed: () {
            query = '';
          },
          icon: Icon(Icons.clear))
    ];
  }

  @override
  Widget buildLeading(BuildContext context) {
    return IconButton(
        onPressed: () {
          close(context, '');
        },
        icon: Icon(Icons.arrow_back));
  }

  @override
  Widget buildResults(BuildContext context) {
    return Container();
  }

  @override
  Widget buildSuggestions(BuildContext context) {
    final suggestions = names.where((name) {
      return name.name.toLowerCase().contains(query.toLowerCase());
    });
    return FutureBuilder(
      future: getNames(),
      builder: (context, snapshot) {
        if (query.isEmpty) return Center(child: Text(""));
        switch (snapshot.connectionState) {
          case ConnectionState.waiting:
            return Center(child: Text(""));
          default:
            if (snapshot.hasError) {
              return Center(child: Text(""));
            } else {
              return ListView.builder(
                itemCount: suggestions.length,
                itemBuilder: (context, i) {
                  return ListTile(
                    title: Text(suggestions.elementAt(i).name),
                  );
                },
              );
            }
        }
      },
    );
  }
}