Android app for the VienDesu!
- Dart 99.4%
- Nix 0.6%
| Filename | Latest commit message | Latest commit date |
|---|---|---|
AppFlowyEditor's overlay asserts on unbounded height, and every host put it inside a scroll view, so the subtree fell back to an error widget — a black rectangle in release builds — wherever an editor appeared: writing and editing articles, game and author descriptions, author creation and the profile bio. MdEditor now bounds its text area and scrolls the document inside it, or fills a parent that bounds it; the article form spends the whole page on the editor. A test covers both shapes. Search results dropped the fixed row height that clipped a card whose chips wrapped to a second line, cutting the excerpt mid-line. Rows size to their content, cards side by side stretch to the taller one, and the marks are capped at four with a "+N" remainder. Polish: - skeletons stand in for spinners while a page loads - the poster flies from a tile into the game page it opens - game search filters fold away behind a toggle that counts them - browsing pages keep search in the app bar - content is capped at 920px on tablets and in landscape - the app bar tints when content scrolls under it - tiles and the rating meter answer with haptics - the game page pulls to refresh, a failed home page offers a retry - entrance animations respect the system's reduce-motion setting Co-Authored-By: Eva |
||
| android | ||
| assets/img | ||
| lib | ||
| test | ||
| .envrc | ||
| .gitignore | ||
| analysis_options.yaml | ||
| flake.lock | ||
| flake.nix | ||
| pubspec.lock | ||
| pubspec.yaml | ||
| README.md | ||
VienDesu! — Android
Android-клиент агрегатора визуальных новелл, feature-parity с веб-фронтендом
(../frontend), кроме создания игр и авторов — только просмотр, поиск и
редактирование.
Стек
- Flutter (Material 3, тёмная тема, indigo — как на вебе)
- flutter_bloc — кубиты на бизнес-логику
(
SessionCubit,PagedSearchCubit, по кубиту на экран данных), зависимости черезRepositoryProvider; эфемерное состояние форм — локально в виджетах - go_router — маршруты зеркалят веб-URL (
/@author/@game,/profiles/@nick), так что ссылки с сайта диплинкуются 1-в-1 - Слои:
core/(Result/Patch),domain/(sealed-модели),data/(API-клиент, репозитории, сессия),features/(экраны + кубиты),shared/(виджеты)
Сборка
nix develop # flutter + android sdk + jdk
flutter pub get
flutter analyze && flutter test
flutter build apk --release
Эндпоинты переопределяются на этапе сборки:
flutter build apk --dart-define=API_URL=https://api.viende.su/ \
--dart-define=CDN_URL=https://cdn.viende.su/
По умолчанию — staging (api.desu.church).
Контракт с бэкендом
- Ответы — конверт
{"ok": ...} | {"error": ..., "description": ...}(core/result.dart). - PATCH-семантика:
{"change": v}ставит поле, пропущенное поле не трогает (core/patch.dart, сравнение глубокое, шлём только изменённые поля). - Загрузка файлов двухшаговая:
POST /uploads→POST /uploads/{id}(multipart, полеfile). - Сессия — Bearer-токен, хранится в EncryptedSharedPreferences.