Android 构建建议时颤振showSearch异步操作
我正在使用Flatter showSearch功能搜索地址。到目前为止一切正常。现在,我想实现在用户每次更改搜索输入时重新生成的建议。要做到这一点,我使用的是颤振地理代码库 问题是,我不知道如何在使用buildSuggestions函数生成建议时执行异步操作 显然,我不能简单地使buildSuggestions函数异步,但如果可以,我的代码将如下所示:Android 构建建议时颤振showSearch异步操作,android,asynchronous,flutter,dart,Android,Asynchronous,Flutter,Dart,我正在使用Flatter showSearch功能搜索地址。到目前为止一切正常。现在,我想实现在用户每次更改搜索输入时重新生成的建议。要做到这一点,我使用的是颤振地理代码库 问题是,我不知道如何在使用buildSuggestions函数生成建议时执行异步操作 显然,我不能简单地使buildSuggestions函数异步,但如果可以,我的代码将如下所示: @override Future<Widget> buildSuggestions(BuildContext context) as
@override
Future<Widget> buildSuggestions(BuildContext context) async {
var addresses = await Geocoder.local.findAddressesFromQuery(query);
final Iterable<Address> suggestions = query.isEmpty
? _history
: addresses;
return _SuggestionList(
query: query,
suggestions: suggestions.map<String>((String i) => '$i').toList(),
onSelected: (String suggestion) {
query = suggestion;
this.close(context, query);
},
);
}
@覆盖
未来构建建议(构建上下文)异步{
var addresses=wait Geocoder.local.findAddressesFromQuery(查询);
final Iterable suggestions=query.isEmpty
历史
:地址;
返回建议列表(
查询:查询,
建议:suggestions.map((字符串i)=>“$i”).toList(),
onSelected:(字符串建议){
查询=建议;
this.close(上下文、查询);
},
);
}
一定有办法实现我想做的事。有什么建议吗
更新:
在frank06帖子的帮助下,我编写了以下代码:
@override
Widget buildSuggestions(BuildContext context) {
return FutureBuilder(
future: Geocoder.local.findAddressesFromQuery(query),
builder: (BuildContext context, AsyncSnapshot<List<Address>> snapshot) {
// check if snapshot.hasData
if (snapshot.connectionState == ConnectionState.done) {
List<Address> addresses;
if (snapshot.hasData) {
addresses = snapshot.data;
} else {
addresses = List<Address>();
}
List<String> addressNames = addresses.map((address) {
return address.addressLine;
}).toList();
final Iterable<String> suggestions =
query.isEmpty ? _history : addressNames;
return _SuggestionList(
query: query,
suggestions: suggestions.map<String>((String i) => '$i').toList(),
onSelected: (String suggestion) {
query = suggestion;
this.close(context, query);
},
);
} else {
return _SuggestionList(
query: query,
suggestions: List<String>(),
onSelected: (String suggestion) {
query = suggestion;
this.close(context, query);
});
}
});
}
@凌驾
小部件构建建议(构建上下文){
回归未来建设者(
未来:Geocoder.local.findAddressesFromQuery(查询),
生成器:(BuildContext上下文,异步快照){
//检查snapshot.hasData
if(snapshot.connectionState==connectionState.done){
列出地址;
if(snapshot.hasData){
地址=快照数据;
}否则{
地址=列表();
}
列表地址名称=地址.map((地址){
返回地址.addressLine;
}).toList();
最后的建议=
query.isEmpty?\u历史记录:地址名称;
返回建议列表(
查询:查询,
建议:suggestions.map((字符串i)=>“$i”).toList(),
onSelected:(字符串建议){
查询=建议;
this.close(上下文、查询);
},
);
}否则{
返回建议列表(
查询:查询,
建议:列表(),
onSelected:(字符串建议){
查询=建议;
this.close(上下文、查询);
});
}
});
}
我觉得我离解决方案更近了,但目前我遇到了一个问题,snapshot.hasData总是返回false
还有什么建议吗
最终更新:
最后它成功了。我的未来不会返回数据,因为我没有确定我的查询实际上是数据类型字符串。下面的代码是最终的功能版本。(再次感谢frank06!)
@覆盖
小部件构建建议(构建上下文){
字符串queryString=query;
回归未来建设者(
future:queryString.length>0?Geocoder.local.findAddressesFromQuery(queryString):future.value(List()),
生成器:(BuildContext上下文,异步快照){
if(snapshot.connectionState==connectionState.done){
列出地址;
if(snapshot.hasData){
地址=快照数据;
}否则{
地址=列表();
}
列表地址名称=地址.map((地址){
返回地址.addressLine;
}).toList();
最后的建议=
query.isEmpty?\u历史记录:地址名称;
返回建议列表(
查询:查询,
建议:suggestions.map((字符串i)=>“$i”).toList(),
onSelected:(字符串建议){
查询=建议;
this.close(上下文、查询);
},
);
}否则{
返回建议列表(
查询:查询,
建议:列表(),
onSelected:(字符串建议){
查询=建议;
this.close(上下文、查询);
});
}
});
}
返回一个FutureBuilder
:
未来构建建议(构建上下文){
回归未来建设者(
未来:Geocoder.local.findAddressesFromQuery(查询),
生成器:(BuildContext上下文,异步快照){
//检查snapshot.hasData
var地址=snapshot.data;
最终Iterable返回一个FutureBuilder
:
未来构建建议(构建上下文){
回归未来建设者(
未来:Geocoder.local.findAddressesFromQuery(查询),
生成器:(BuildContext上下文,异步快照){
//检查snapshot.hasData
var地址=snapshot.data;
final Iterable嘿,弗兰克,谢谢你的帖子!我明白你的建议了。我想它可能会起作用,atm我只是有个问题,snapshot.hasData总是返回false。不客气,Jakub,你检查了hasrerror
?你的未来真的有效吗?@Jakub try未来:未来.value([Address(),Address())
(例如,两个虚拟地址)如果这对snapshot.data起作用,那么问题在于你的未来再次感谢你,你帮了我很大的忙!问题是,我的未来实际上没有返回任何数据,因为“查询”不是String类型。在我将查询转换为String之后,一切都很好(:嘿,弗兰克,谢谢你的帖子!我明白你的建议了。我想这可能行得通,atm我只是有个问题,snapshot.hasData总是返回false。不客气,Jakub,你检查了hasrerror
?你的未来真的有效吗?@Jakub try未来:未来。值([Address(),Address())
(例如,两个虚拟值)
@override
Widget buildSuggestions(BuildContext context) {
String queryString = query;
return FutureBuilder(
future: queryString.length > 0 ? Geocoder.local.findAddressesFromQuery(queryString) : Future.value(List<Address>()),
builder: (BuildContext context, AsyncSnapshot<List<Address>> snapshot) {
if (snapshot.connectionState == ConnectionState.done) {
List<Address> addresses;
if (snapshot.hasData) {
addresses = snapshot.data;
} else {
addresses = List<Address>();
}
List<String> addressNames = addresses.map((address) {
return address.addressLine;
}).toList();
final Iterable<String> suggestions =
query.isEmpty ? _history : addressNames;
return _SuggestionList(
query: query,
suggestions: suggestions.map<String>((String i) => '$i').toList(),
onSelected: (String suggestion) {
query = suggestion;
this.close(context, query);
},
);
} else {
return _SuggestionList(
query: query,
suggestions: List<String>(),
onSelected: (String suggestion) {
query = suggestion;
this.close(context, query);
});
}
});
}