Android 构建建议时颤振showSearch异步操作

Android 构建建议时颤振showSearch异步操作,android,asynchronous,flutter,dart,Android,Asynchronous,Flutter,Dart,我正在使用Flatter showSearch功能搜索地址。到目前为止一切正常。现在,我想实现在用户每次更改搜索输入时重新生成的建议。要做到这一点,我使用的是颤振地理代码库 问题是,我不知道如何在使用buildSuggestions函数生成建议时执行异步操作 显然,我不能简单地使buildSuggestions函数异步,但如果可以,我的代码将如下所示: @override Future<Widget> buildSuggestions(BuildContext context) as

我正在使用Flatter showSearch功能搜索地址。到目前为止一切正常。现在,我想实现在用户每次更改搜索输入时重新生成的建议。要做到这一点,我使用的是颤振地理代码库

问题是,我不知道如何在使用buildSuggestions函数生成建议时执行异步操作

显然,我不能简单地使buildSuggestions函数异步,但如果可以,我的代码将如下所示:

@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);
               });
         }
       });
 }