Привет, с вами Роза, Flutter Dev Friflex👋 И сегодня мы немного погрузимся в магию FutureOr!
Представьте, вы создаете некий абстрактный класс с различными методами, но точно не знаете, будет ли реализация асинхронной или синхронной. Конечно, вы можете создать два метода или изощряться с разными подходами, но действительно ли это хорошее решение?
Лучше, если вы объявите метод, как FutureOr. FutureOr — это такой хитрый тип в Dart, который говорит: «Эй, результат моего метода может быть либо обычным значением типа T, либо Future, если вдруг придется подождать».
Звучит пока не очень понятно? Давайте разберемся на примерах.
Предположим, мы разрабатываем сервис, который получает данные. Одна реализация будет синхронной, другая — асинхронной:
`import 'dart:async';
abstract class SomeService { FutureOr fetch(); }
class FirstImplService extends SomeService { @override Future fetch() async { await Future.delayed(Duration(seconds: 2)); return 'Данные из Future'; } }
class SecondImplService extends SomeService { @override String fetch() { return 'Простые данные'; } }
Aбстрактный класс SomeService объявляет метод fetch() с типом возвращаемого значения FutureOr. Это значит, что fetch() может вернуть либо String, либо Future.
⚙️Когда же использовать FutureOr? FutureOr — ваш спаситель, когда вам нужно абстрагироваться от того, является ли результат операции асинхронным или синхронным.
🔧Как обрабатывать FutureOr? Самый простой способ — использовать проверку типа с помощью is Future.
Да, такой вариант решения может показаться не самым элегантным. Ведь чрезмерное использование is Future может запутать логику и сделать код менее читаемым. Но в некоторых случаях, особенно при работе с абстракциями, это вполне рабочий и понятный подход.
У меня с работой так же. Иногда мне нужен await, чтобы подумать, а иногда все складывается супер. А у вас?`