【发布时间】:2019-03-25 16:24:46
【问题描述】:
我需要使用默认 Flutter 的 SearchPage 获得 Google Places 搜索建议,每当用户开始输入时,我需要提供自动完成建议,并且我使用 FutureBuilder 异步实现这一点,现在的问题是我需要在 500 毫秒或更长时间内消除搜索请求的分派,而不是在用户仍在键入时浪费大量请求
总结一下我到目前为止所做的事情:
1) 在我的小部件中,我调用了
showSearch(context: context, delegate: _delegate);
2) 我的委托看起来像这样:
class _LocationSearchDelegate extends SearchDelegate<Suggestion> {
@override
List<Widget> buildActions(BuildContext context) {
return <Widget>[
IconButton(
tooltip: 'Clear',
icon: const Icon(Icons.clear),
onPressed: () {
query = '';
showSuggestions(context);
},
)
];
}
@override
Widget buildLeading(BuildContext context) => IconButton(
tooltip: 'Back',
icon: AnimatedIcon(
icon: AnimatedIcons.menu_arrow,
progress: transitionAnimation,
),
onPressed: () {
close(context, null);
},
);
@override
Widget buildResults(BuildContext context) {
return FutureBuilder<List<Suggestion>>(
future: GooglePlaces.getInstance().getAutocompleteSuggestions(query),
builder: (BuildContext context, AsyncSnapshot<List<Suggestion>> suggestions) {
if (!suggestions.hasData) {
return Text('No results');
}
return buildLocationSuggestions(suggestions.data);
},
);
}
@override
Widget buildSuggestions(BuildContext context) {
return buildResults(context);
}
Widget buildLocationSuggestions(List<Suggestion> suggestions) {
return ListView.builder(
itemBuilder: (context, index) => ListTile(
leading: Icon(Icons.location_on),
title: Text(suggestions[index].text),
onTap: () {
showResults(context);
},
),
itemCount: suggestions.length,
);
}
}
3-我需要限制/去抖动搜索直到 xxx 毫秒过去
我有一个想法,是否有一种简单的方法可以将 FutureBuilder 转换为 Stream 并使用 Stream 构建器(我在一些文章中读到它支持去抖动)?
**我知道有一些第 3 方 AutoComplete 小部件(如 TypeAhead)正在这样做(从头开始),但我现在不想使用它。
【问题讨论】:
-
您的问题解决了吗?我想实现与上述相同的功能,但无法做到..