2017-02-14 3 views
1

Эй, я очень новичок в Dart Futures, и у меня есть следующая ситуация.Dart Component: Как вернуть результат асинхронного обратного вызова?

Когда пользователь вводит письмо в пользовательском интерфейсе, вызывается метод addressChanged() в моем ui_component. Этот метод вызывает метод getProposals() в моих картах componentenet, который выполняет асинхронный запрос API-интерфейсов google. Как только результаты здесь, я хочу вернуть их в компонент пользовательского интерфейса, который будет заполнять раскрывающийся список просасалов в пользовательском интерфейсе.

Я застрял с последним шагом: Как (и как лучше всего) вернуть результаты асинхронной функции обратного вызова в родительский компонент (при сохранении компонента многократных карт?).

Это то, что я пробовал:

1) UI_Component:

// I get called if a user typed a new letter 
    Future addressChanged(dynamic event) async { 
     String id = event.target.id; 
     String address = event.target.value; 
      if(id=="pickup") { 
       this.pickup = address; 
      } else if(id=="destination") { 
       this.destination = address; 
      } 
     // this is where I call the subcomponent and want to get the address propasals 
     String proposals = await googleMap.getProposals(address,id); 
     print(proposals); 
     populateProposalDropdown(); 
     } 

2) Google Map компонента:

Future getProposals(String address,String id) async { 
    await _getProposals(address,id); 
    } 

    Future _getProposals(String address,String id) async { 

    if(address != "") { 
     autocompleteService.getPlacePredictions(
      new AutocompletionRequest() 
      ..input = address 
      , 
      (predictions,status) { 
      List<String> result = []; 
      if(status == PlacesServiceStatus.OK) { 
       predictions.forEach(
        (AutocompletePrediction prediction) => 
         result.add(prediction.description) 
      ); 
      } 

      // HERE is the problem: How do I return this result from the callback as a result of the getProposals method? 
      return result; 
      } 
    ); 
    } 
    } 
+1

ли 'AutoCompleteService' код? Его можно было бы переписать, чтобы вернуть «Будущее», а не вызвать обратный вызов, что избавит вас от необходимости использовать «Завершить» при его вызове. –

+0

Несчастливо его нет: https://pub.dartlang.org/packages/google_maps. Они должны реально реализовать библиотеку, подобную этой ;-) – Blackbam

ответ

3

Этот метод не возвращает никаких данных

Future getProposals(String address,String id) async { 
    await _getProposals(address,id); 
    } 

Изменить его на

Future getProposals(String address,String id) { 
    return _getProposals(address,id); 
    } 

Это также будет работать, но здесь async и await является redunant

Future getProposals(String address,String id) async { 
    return await _getProposals(address,id); 
    } 

Для _getProposals вы можете использовать Completer

Future _getProposals(String address,String id) async { 
    if(address != "") { 
     Completer completer = new Completer(); 

     autocompleteService.getPlacePredictions(
      new AutocompletionRequest() 
      ..input = address 
      , 
      (predictions,status) { 
      List<String> result = []; 
      if(status == PlacesServiceStatus.OK) { 
       predictions.forEach(
        (AutocompletePrediction prediction) => 
         result.add(prediction.description) 
      ); 
      } 

      // HERE is the problem: How do I return this result from the callback as a result of the getProposals method? 
      completer.complete(result); 
      } 
    ); 
     return completer.future; 
    } 
    return null; 
    } 
+1

Thx thats именно то, что мне нужно :-) – Blackbam

+0

Рад слышать :) –