Дарт, как создать будущее, чтобы вернуться в свои собственные функции?

Можно ли создать свои собственные фьючерсы в Dart, чтобы вернуться из ваших методов, или вы всегда должны возвращать построенный в будущем возврат из одного из методов библиотек ацетинга dart?

Я хочу определить функцию, которая всегда возвращает Future<List<Base>>, действительно ли она выполняет асинхронный вызов (файл read/ajax/etc) или просто получает локальную переменную, как показано ниже:

List<Base> aListOfItems = ...;

Future<List<Base>> GetItemList(){

    return new Future(aListOfItems);

}

Ответ 1

Если вам нужно создать будущее, вы можете использовать Completer. См. Completer класс в документах. Вот пример:

Future<List<Base>> GetItemList(){
  var completer = new Completer();

  // At some time you need to complete the future:
  completer.complete(new List<Base>());

  return completer.future;
}

Но большую часть времени вам не нужно создавать будущее с дополнением. Как в этом случае:

Future<List<Base>> GetItemList(){
  var completer = new Completer();

  aFuture.then((a) {
    // At some time you need to complete the future:
    completer.complete(a);
  });

  return completer.future;
}

Код может стать очень сложным с использованием обработчиков. Вместо этого вы можете просто использовать следующее: then() также возвращает Future:

Future<List<Base>> GetItemList(){
  return aFuture.then((a) {
    // Do something..
  });
}

Или пример файла io:

Future<List<String>> readCommaSeperatedList(file){
  return file.readAsString().then((text) => text.split(','));
}

Подробнее см. этот пост в блоге.

Ответ 2

Вы можете просто использовать Future<T>value конструктор фабрики:

return Future<String>.value('Back to the future!');

Ответ 3

@Fox32 имеет правильный ответ, кроме того, нам нужно упомянуть тип завершителя, в противном случае мы получим исключение

Exception received is type 'Future<dynamic>' is not a subtype of type 'FutureOr<List<Base>>

поэтому инициализация завершителя станет

var completer= new Completer<List<Base>>();

Ответ 4

Или вы можете пометить его как метод async:

Future<String> myFutureMethod() async {

  // do something that takes a while

  return 'done';
}