Ответ
Асинхронная функция, помеченная ключевым словом async, всегда возвращает объект типа Future<T>. T — это тип реального значения, которое будет вычислено в будущем.
- Если функция возвращает
String, то ее сигнатура будетFuture<String>. - Если функция не возвращает явного значения (
void), то сигнатура —Future<void>.
Пример:
Future<int> fetchUserId() async {
await Future.delayed(Duration(seconds: 1)); // Имитация асинхронной операции
return 42; // Значение 42 будет обернуто в Future<int>
}
Future<void> logMessage(String message) async {
print(message);
// Неявно возвращается Future<void>
}
void main() async {
// Обработка через await
final int id = await fetchUserId();
// Обработка через then/catchError
fetchUserId().then((id) {
print('User ID: $id');
}).catchError((error) {
print('Ошибка: $error');
});
}
Ключевые моменты:
Future— это контейнер для отложенного результата (успешного значения или ошибки).- Ключевое слово
asyncпозволяет использоватьawaitвнутри функции и автоматически оборачивает возвращаемое значение вFuture. - Для работы с
Futureиспользуютсяawait(внутриasync-функций) или методыthen(),catchError(),whenComplete().
Ответ 18+ 🔞
Э, слушай, вот тебе история про эти ваши async функции в Dart. Ситуация, блядь, как с пиццей, которую заказал, а она ещё едет. Ты точно знаешь, что будет пицца, но пока у тебя на руках только квитанция — вот это и есть Future<T>. T — это тип самой пиццы, String там или int.
Вот смотри, объявляешь ты функцию с этим async — и всё, ёпта, она уже не возвращает просто String. Она возвращает обещание, что когда-нибудь тебе дадут эту строку. Получается Future<String>. Если функция просто делает дело и ничего не отдаёт (void), то она возвращает Future<void> — типа, обещание, что дело когда-то сделается, и всё.
Смотри, как это выглядит:
Future<int> fetchUserId() async {
await Future.delayed(Duration(seconds: 1)); // Прикинь, типа ждём курьера секунду
return 42; // А вот и пицца... то есть, юзер айди! Но обёрнутое в Future<int>
}
Future<void> logMessage(String message) async {
print(message);
// Тут Future<void> вернётся само, даже писать не надо
}
void main() async {
// Вариант для терпеливых: сиди и жди (await)
final int id = await fetchUserId(); // Сидишь, бздишь, пока не привезут
// Вариант для похуистов: скажи, что сделать, когда привезут (then/catchError)
fetchUserId().then((id) {
print('User ID: $id'); // О, приехало! Распаковывай.
}).catchError((error) {
print('Ошибка: $error'); // Ага, курьер с пиццей улетел в кювет. Пиздец.
});
}
Короче, суть, чтобы ты запомнил:
Future— это не значение, а бумажка, что значение будет. Контейнер, блядь, для того, что ещё в пути (или для ошибки, если всё накрылось медным тазом).- Волшебное слово
asyncделает две вещи: разрешает внутри использоватьawaitи автоматически, ёб твою мать, заворачивает твойreturnв этот самыйFuture. Самому париться не надо. - Работать с этой хуйнёй можно двумя способами: либо сидеть и трястись в ожидании с
await(только внутри другихasync-функций), либо отдать инструкции —then()(когда приедет),catchError()(если всё просрётся) иwhenComplete()(когда вообще всё уже кончится, неважно как). Выбирай, что тебе ближе по характеру.