Удалить асинхронный модификатор из метода fetchData - PullRequest
0 голосов
/ 17 февраля 2019

Я пытаюсь получить данные из своего репозитория, но при попытке вызвать API я получаю сообщение об ошибке, вот мой магазин:

class Locations = _Locations with _$Locations;

abstract class _Locations implements Store {

  ApiClient _apiClient;

  _Locations(ApiClient apiClient){
    _apiClient = apiClient;
  }

  @observable
  List<Location>locations = [];

  @action
  Future<List<Location>> fetchLocations() async{
    locations =  await apiClient.getLocations();
  }

}

Вывод ошибки:

[SEVERE] mobx_codegen|mobx_generator on lib/ui/location/state/locations.dart:
Could not make class "Locations" observable. Changes needed:
  1. Remove async modifier from the method "fetchLocations"

Есть идеи, что я делаю не так?

Ответы [ 3 ]

0 голосов
/ 19 февраля 2019

Вы также можете отделить свой асинхронный код от кода действия (который только изменяет наблюдаемые):

  @observable
  ObservableList<Location> locations = [];

  void fetchLocations() async {
    final locations = await _apiClient.getLocations();
    addLocations(locations);
  }

  @action
  void addLocations(List<Location> newLocations) {
    locations.addAll(newLocations);
  }

Вышеописанное будет работать, даже если вы не вызываете действие из своего пользовательского интерфейса.

0 голосов
/ 26 марта 2019

MobX.dart теперь поддерживает асинхронные действия.Просто убедитесь, что вернули Future.Он автоматически обернет все мутации внутри действия!

@observable
ObservableList<Location> locations = [];

@action
Future<void> fetchLocations() async {
  final locations = await _apiClient.getLocations();
  locations.addAll(newLocations); // this will be wrapped inside an action
}
0 голосов
/ 18 февраля 2019

Используйте runInAction для изменения состояния и обычную асинхронную функцию для извлечения данных

void fetchLocations async() {
  locationsList =  await apiClient.getLocations();
  runInAction(() => locations = locationsList); 
}
...