Комментарии (2)
🐱
claude-haiku-4.5PrepBro AI29 мар. 2026 г.(ред.)
Ответ сгенерирован нейросетью и может содержать ошибки
Функциональный интерфейс
Функциональный интерфейс (Functional Interface) — это интерфейс, который содержит ровно ОДИН абстрактный метод. Это концепция, введённая в Java 8 (хотя Dart имеет свою интерпретацию).
В контексте Dart и Flutter
В Dart нет явной концепции "функционального интерфейса" как в Java, но есть похожая идея — интерфейсы с одним методом, которые часто используются как callback'и или обработчики.
// Функциональный интерфейс в Dart
abstract class ValueBuilder<T> {
T build(); // Один абстрактный метод
}
// Можно реализовать лаконично
class IntValueBuilder implements ValueBuilder<int> {
@override
int build() => 42;
}
Функции как интерфейсы
В Dart часто вместо функциональных интерфейсов используются функциональные типы:
// Вместо интерфейса используем Function type
typedef ValueBuilder<T> = T Function();
// Использование
ValueBuilder<String> stringBuilder = () => "Hello";
print(stringBuilder()); // Hello
// Или с параметрами
typedef Transformer<T, R> = R Function(T);
Transformer<int, String> intToString = (int value) => value.toString();
print(intToString(42)); // "42"
Примеры из Flutter
VoidCallback
// Функциональный интерфейс с нулевыми параметрами
typedef VoidCallback = void Function();
class Button {
final VoidCallback onPressed;
Button({required this.onPressed});
void click() => onPressed();
}
// Использование
Button(
onPressed: () => print("Clicked"),
).click();
ValueChanged
// Функциональный интерфейс с одним параметром
typedef ValueChanged<T> = void Function(T value);
class TextField {
final ValueChanged<String> onChanged;
TextField({required this.onChanged});
void updateValue(String newValue) => onChanged(newValue);
}
// Использование
TextField(
onChanged: (value) => print("New value: $value"),
).updateValue("Hello");
Практические примеры с пользовательскими интерфейсами
Пример 1: Builder паттерн
abstract class Widget {
void render();
}
class ButtonBuilder {
final VoidCallback onPressed;
String label = "Click me";
ButtonBuilder({required this.onPressed});
Widget build() => _Button(label, onPressed);
}
class _Button implements Widget {
final String label;
final VoidCallback onPressed;
_Button(this.label, this.onPressed);
@override
void render() {
print("Button: $label");
onPressed();
}
}
// Использование
ButtonBuilder(onPressed: () => print("Pressed!"))
..label = "Submit"
..build()
.render();
Пример 2: AsyncCallback
typedef AsyncCallback<T> = Future<T> Function();
class DataLoader<T> {
final AsyncCallback<T> loader;
DataLoader({required this.loader});
Future<T> load() => loader();
}
// Использование
final userLoader = DataLoader<String>(
loader: () async {
await Future.delayed(Duration(seconds: 1));
return "User loaded";
},
);
await userLoader.load(); // User loaded
Пример 3: Predicate
typedef Predicate<T> = bool Function(T);
List<T> filter<T>(List<T> items, Predicate<T> predicate) {
return items.where((item) => predicate(item)).toList();
}
// Использование
final numbers = [1, 2, 3, 4, 5];
final evenNumbers = filter(numbers, (n) => n % 2 == 0);
print(evenNumbers); // [2, 4]
Интерфейсы vs Функции
// Вариант 1: Интерфейс (классический OOP)
abstract class Calculator {
int calculate(int a, int b);
}
class Adder implements Calculator {
@override
int calculate(int a, int b) => a + b;
}
// Вариант 2: Функция (функциональный стиль)
typedef Calculator = int Function(int, int);
Calculator adder = (a, b) => a + b;
// Использование
print(Adder().calculate(5, 3)); // 8
print(adder(5, 3)); // 8
Когда использовать
- Callbacks — обработчики событий, нажатия кнопок
- Builders — создание сложных объектов
- Predicates — фильтрация и поиск
- Transformers — преобразование данных
- Listeners — подписка на изменения
Плюсы
- Простота и лаконичность кода
- Легко передавать как параметры
- Отличная для функционального стиля программирования
Функциональные интерфейсы — это мощный инструмент в Dart для написания чистого и функционального кода.