Irbisa · Шпаргалка
Асинхронность и Future
Future, async/await, then/catchError, FutureBuilder
Что такое
Future, как работаютasyncиawaitи как обрабатывать ошибки Future?Future<String> fetchUser(int id) async { await Future<void>.delayed(const Duration(seconds: 1)); // stands in for a network call if (id <= 0) throw ArgumentError.value(id, 'id'); return 'User #$id';}…Выполняет ли
async/awaitваш код в другом потоке?Что выведет этот код и какая часть
load()выполнится до того, какmain()пойдёт дальше?Future<void> load() async { print('2'); await Future<void>.delayed(Duration.zero); print('4');} void main() { print('1'); load(); print('3');}Чем цепочка
.then()отличается отasync/awaitи чемwhenComplete()отличается отthen()?// then-chainFuture<Profile> loadChain(String id) { return api .user(id) .then((u) => api.profile(u.id)) .catchError((Object e) => Profile.empty());…Что такое
Timer/Timer.periodic, как его отменить и что будет, если забыть отменить его вdispose()?class _ClockState extends State<Clock> { Timer? _ticker; Timer? _debounce; DateTime _now = DateTime.now(); @override…Что делает
FutureBuilderи почему его Future нельзя создавать внутриbuild()?class ProfilePage extends StatefulWidget { const ProfilePage({super.key, required this.id}); final String id; @override State<ProfilePage> createState() => _ProfilePageState();…Почему
async-функция должна возвращатьFuture<void>, а неvoid?// wrong: callers cannot wait for it or catch its errorsvoid saveDraftVoid() async { await storage.write(draft);} // right…Что будет, если забыть
awaitу Future, и когда допустим fire-and-forget черезunawaited()?Future<void> onSave() async { await repo.save(draft); // right: wait for what the next line depends on unawaited(analytics.track("saved").catchError(logDrop)); // fire-and-forget, errors handled // wrong: repo.save(draft); close(); // close() runs before the save finishes}Найдите баг: тост «All photos synced» появляется, пока фото ещё загружаются.
Future<void> syncPhotos(List<Photo> photos) async { photos.forEach((photo) async { await api.upload(photo); await db.markSynced(photo.id); }); showToast('All ${photos.length} photos synced');}Как запустить несколько Future одновременно и что происходит, если один из них падает?
Future<void> load(String id) async { // Same type: one list, results in the original order final pages = await Future.wait([loadPage(1), loadPage(2), loadPage(3)]); // Per-future fallback: one failure does not lose the other result final counts = await Future.wait([…Как работает event loop в Dart и чем очередь микрозадач отличается от очереди событий?
В каком порядке выведет строки этот код и почему?
void main() { print('A'); Future(() => print('B')); Future.delayed(Duration.zero, () => print('C')); scheduleMicrotask(() => print('D')); Future.value(1).then((_) => print('E')); Future.sync(() => print('F')); print('G');}Что такое
Completerи когда его использовать?Future<Position> currentPosition(LocationSdk sdk) { final completer = Completer<Position>(); sdk.requestOnce( onSuccess: (pos) { if (!completer.isCompleted) completer.complete(pos);…Что такое
FutureOr<T>и когда функция возвращает его вместоFuture<T>?FutureOr<User> getUser(String id) { final cached = _cache[id]; if (cached != null) return cached; // synchronous: no event-loop turn return _fetchAndCache(id); // Future<User>}…Почему
catchErrorздесь не срабатывает при пустомidи как это исправить?Future<User> load(String id) { if (id.isEmpty) throw ArgumentError.value(id, 'id'); return api.getUser(id);} void onTap(String id) { load(id).catchError((Object e) { log('failed: $e'); return User.guest(); });}Найдите баг: без сети
loadProfileбросает исключение вместо того, чтобы вернуть профиль из кэша.Future<Profile> loadProfile(String id) async { try { return api.fetchProfile(id); } on NetworkException { return cache.read(id); }}Как добавить к Future таймаут и повторные попытки?
Future<T> retry<T>( Future<T> Function() task, { int maxAttempts = 4, Duration baseDelay = const Duration(milliseconds: 500), bool Function(Object error) retryIf = _isTransient,}) async {…Как перехватить все необработанные ошибки во Flutter-приложении и почему не работает
try/catchвокругrunApp()?void main() { WidgetsFlutterBinding.ensureInitialized(); FlutterError.onError = (FlutterErrorDetails details) { FlutterError.presentError(details); // keep the console output crashReporter.recordFlutterError(details);…Future в Dart нельзя отменить. Как остановить работу, когда пользователь уже ушёл с экрана?
class _SearchState extends State<Search> { int _latest = 0; List<Hit> _hits = const []; CancelableOperation<List<Hit>>? _op; Future<void> onQueryChanged(String q) async {…Вы сохраняете Future в поле и через секунду ожидаете его в
try/catch, но приложение всё равно логирует необработанное исключение. Почему?class Warmup { // wrong: starts now and may fail before anyone listens final Future<Config> _config = loadConfig(); Future<void> run() async { await Future<void>.delayed(const Duration(seconds: 1));…В крэш-репортах стек-трейс обрывается на event loop, а не на строке сбоя. Что теряет источник асинхронной ошибки?
// wrong: a new throw builds a new traceFuture<void> saveLosing(Order order) async { try { await repo.save(order); } catch (e) { throw SaveFailed('$e'); // the trace now starts on this line…Dart однопоточный. Как два асинхронных вызова всё равно могут устроить гонку и как сериализовать доступ к общему ресурсу?
class TokenManager { Future<Tokens>? _refreshing; // every caller during a refresh shares one request Future<Tokens> refresh() => _refreshing ??= _doRefresh().whenComplete(() => _refreshing = null);…