TypeMonkey хорошо напоминает: десктопным приложениям на Flutter сначала нужна архитектура, потом полировка
TypeMonkey, десктопное приложение для тренировки набора текста на Flutter, показывает, почему десктопным проектам нужна чистая архитектура с первого дня: sealed-состояния, границы по интерфейсам и тестируемая логика.
Сегодня на r/FlutterDev появился небольшой десктопный проект на Flutter: TypeMonkey, приложение для тренировки набора в духе MonkeyType, которое явно позиционируется как “ранний, но структурированный” вариант.
Источник: оригинальный пост и репозиторий: тред на r/FlutterDev и BaldGhost-git/typemonkey.
Десктоп - это место, где “просто выкатить UI” перестаёт работать
На мобильных иногда удаётся обойтись одним объектом состояния и кучей виджетов. На десктопе (Flutter 3.x + Dart 3.x) вы быстро упираетесь в другие нагрузки:
- Сценарии “клавиатура прежде всего”: горячие клавиши, управление фокусом, предсказуемая обработка нажатий.
- Чувствительность к задержкам: ваш UI не должен дёргаться при обновлении статистики, загрузке истории или подсчёте WPM.
- Расползание возможностей: профили, режимы практики, списки слов, темы, офлайн-хранение.
Поэтому мне нравятся проекты, которые начинаются со структуры. Чистая архитектура - не религия, а способ сделать вторую и третью возможность менее болезненными, чем первая.
Моделируйте цикл набора текста как явные состояния
Dart 3 даёт классы sealed. Для состояния приложения это практичный способ избежать “супа из nullable” и случайных булевых флагов.
Вот минимальная форма состояния для сессии набора, которая остаётся тестируемой и удобной для UI:
sealed class TypingState {
const TypingState();
}
final class Idle extends TypingState {
const Idle();
}
final class Running extends TypingState {
final DateTime startedAt;
final int typedChars;
final int errorChars;
const Running({
required this.startedAt,
required this.typedChars,
required this.errorChars,
});
}
final class Finished extends TypingState {
final Duration duration;
final double wpm;
const Finished({required this.duration, required this.wpm});
}
В Flutter 3.x вы можете подвесить это к любому решению по управлению состоянием (ValueNotifier, Provider, Riverpod, BLoC). Главное, чтобы ваш UI отрисовывал состояние, а не груду условий, размазанных по виджетам.
Держите “список слов” и “статистику” за интерфейсом
Десктопные приложения часто обрастают хранилищем позже. Если вы стартуете с такой границы:
WordSource(сейчас в памяти, позже из файла)SessionRepository(сейчас no-op, позже SQLite)
вы можете держать логику набора детерминированной и unit-тестируемой и при этом выпускать UI рано.
Если вы делаете десктопное приложение на Flutter 3.x и ищете реальный репозиторий как ориентир для структуры, за этим стоит понаблюдать. Даже если вы никогда его не склонируете, главный вывод прост: на десктопе архитектура не избыточна, это то, как вы продолжаете двигаться вперёд.
Comments
Sign in with GitHub to comment. Reactions and replies thread back to the comments repo.