#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),
);
},
);
}
}
},
);
}
}