Изучение
Начало работы
Установите usecase_forge и проведите типизированную команду через полный жизненный цикл.
Начало работы
Создадим UseCase счётчика. Пример невелик, но использует те же команду, контекст выполнения, снимок, конечную фазу и закрытие, что и производственная операция.
Требования
- Dart SDK 3.12.2 или новее.
- Dart-проект с
pubspec.yaml.
Установка
dart pub add usecase_forge
import 'package:usecase_forge/usecase_forge.dart';
State и Command
Состояние — прикладное значение. UseCase Forge не требует базового класса, но содержательное равенство предотвращает лишние публикации.
final class CounterState {
const CounterState(this.value);
final int value;
@override
bool operator ==(Object other) =>
other is CounterState && other.value == value;
@override
int get hashCode => value.hashCode;
}
final class Increment extends UseCaseCommand {
const Increment({this.by = 1});
final int by;
}
Команда описывает намерение. Она не выполняет сама себя и не хранит состояние интерфейса.
Регистрация обработчика Command
final class CounterUseCase extends UseCase<CounterState> {
CounterUseCase() : super(initialState: const CounterState(0)) {
registerCommand<Increment>(_increment);
}
Future<void> _increment(
Increment command,
UseCaseExecutionContext<CounterState> context,
) async {
final current = context.snapshot.state.value;
context.publish(CounterState(current + command.by));
}
}
Регистрация связывает тип команды с обработчиком. context.snapshot предоставляет снимок текущего выполнения, а context.publish проводит новое состояние через упорядоченный вывод.
Выполнение и закрытие
Future<void> main() async {
final counter = CounterUseCase();
final finished = counter.stream.firstWhere(
(snapshot) => snapshot.phase == UseCaseExecutionPhase.finished,
);
counter.add(const Increment(by: 2));
await finished;
print(counter.state.state.value);
await counter.close();
}
add передаёт намерение. Владелец наблюдает жизненный цикл через снимки и дескрипторы выполнения, а затем обязан дождаться close.