架空医薬品・疾患データを扱う医療リファレンスアプリの参考実装。連携 mock-server と組み合わせて動作する Flutter アプリです。
ポートフォリオリポジトリのため外部 PR は受け付けません (Renovate Dependency Dashboard およびセキュリティ通知のため Issue は有効化)。
このアプリの全ての医薬品・疾患・臨床情報は架空のサンプルデータです。医療判断・診断・処方・服薬判断その他のいかなる医療行為にも一切用いないでください。
This application contains FICTIONAL drug, disease, and clinical content. It is NOT medical advice and MUST NOT be used for diagnosis, treatment, prescribing, or any other medical decision.
| 検索画面 | 医薬品詳細画面 | 疾患詳細画面 | ブックマーク画面 |
|---|---|---|---|
![]() |
![]() |
![]() |
![]() |
| 閲覧履歴画面 | 計算ツール画面 BMI | 計算ツール画面 eGFR | 計算ツール画面 CrCl |
![]() |
![]() |
![]() |
![]() |
| ズーム | 履歴削除 |
|---|---|
![]() |
![]() |
- mock-server 連携でオフライン開発可能 — Ktor 製の mock-server を 1 コマンドで起動し、全 HTTP 通信を fixture で完結
- CI で trust 分類 + 4 shard golden VRT — 外部 PR を CI で拒否し、信頼済 PR のみ macOS runner 上で golden VRT を 4 shard 並列実行 (
.github/workflows/ci.yml) - 独自 golden comparator — Roborazzi 仕様を Dart で clean-room 再実装 (
test/golden/_comparator/、third_party 表記済) - l10n SSOT 整合 contract test — mock-server の Kotlin enum KDoc と Flutter 側 arb を
test/l10n/drug_filter_alignment_test.dartで照合 - 6 画面構成 — 検索 (医薬品・疾患セグメント切替・履歴ドロップダウン) / 医薬品詳細 / 疾患詳細 / ブックマーク / 閲覧履歴 / 計算ツール
- 臨床計算ツール — BMI (体重/身長²) / eGFR (日本人係数式) / CrCl (Cockcroft-Gault 式) を独立モジュールで実装、計算履歴をローカル DB に保存
# 1. mock-server を起動 (別リポジトリ)
git clone https://github.com/Corvus400/fictional-drug-and-disease-ref-mock-server.git
cd fictional-drug-and-disease-ref-mock-server && ./scripts/setup.sh && ./scripts/start.sh
# 2. 本リポジトリで依存解決
flutter pub get
# 3. mock-server に接続する dev flavor で起動
flutter run --flavor dev -t lib/main_dev.dart
# Cloudflare ドメイン経由で BE に接続する場合
flutter run --flavor prod -t lib/main_prod.dart --dart-define-from-file=dart_defines/prod.jsonmock-server の詳細は mock-server README を参照してください。
配布版は prod flavor でビルドし、Cloudflare ドメイン経由の BE (https://fictional-drugref.win) に接続します。
Android では上の Android APK download から最新リリースの app-prod-release.apk をダウンロードし、端末で提供元不明アプリのインストールを許可してから APK を開きます。配布 APK は release 署名で作成されるため、次回以降は同じアプリとして上書き更新できます。
iOS では上の iOS TestFlight から TestFlight の外部テスターに参加し、TestFlight アプリ経由でインストールします。配布中の最新ビルドは TestFlight 側で案内されます。
E2E は Patrol で patrol_test/ 配下に実装しています。mock-server と emulator/simulator が必要なため CI や pre-push には含めず、手動で実行します。
flutter pub global activate patrol_cli 4.3.1
scripts/run-patrol-e2e-matrix.shscripts/run-patrol-e2e-matrix.sh は http://localhost:8080/health を確認し、mock-server が未起動の場合のみ隣接する mock-server リポジトリの scripts/start.sh を起動します。既定では Android emulator、iPhone Simulator、iPad Simulator それぞれで portrait / landscape を実行します。
Patrol の app/test server は既定ポート衝突を避けるため 18082 / 18081 を使います。必要に応じて FDDR_E2E_PATROL_APP_SERVER_PORT と FDDR_E2E_PATROL_TEST_SERVER_PORT で上書きできます。
lib/ を UI / application / domain / data の 4 層で分離しています。HTTP クライアント (Dio + Retrofit) と永続化 (drift / SharedPreferences) は data 層、UseCase と Riverpod Provider は application 層、不変な Domain Model は domain 層、Widget / Page は ui 層に集約しています。
graph TD
UI["lib/ui — Widget / Page"]
APP["lib/application — UseCase / Riverpod Provider"]
DATA["lib/data — Repository / DTO / Mapper / API Client"]
DOMAIN["lib/domain — Entity / ValueObject"]
EXT["mock-server (Ktor) | SQLite (drift) | SharedPreferences"]
UI --> APP
APP --> DATA
APP --> DOMAIN
DATA --> DOMAIN
DATA --> EXT
- 依存更新の PR は Renovate で管理しています。
- GitHub Actions と workflow の依存更新は手動レビューで適用しています。
- 外部 PR は CI で拒否されます (レビュー対象外)。
- 一般的なサポート / 機能要望 / バグ報告は GitHub Issues では受け付けていません。
- セキュリティ報告は SECURITY.md の手順に従ってください。
本プロジェクトは MIT License で公開しています。
本リポジトリは以下のサードパーティ成果物を同梱・参照しています。ライセンス全文は third_party/ および assets/fonts/ 配下に再掲しています。
| ライブラリ | ライセンス | 用途 |
|---|---|---|
| Roborazzi | Apache-2.0 | golden test 出力 (*_compare.png / *_actual.png / JSON schema) の仕様参照。test/golden/_comparator/ 配下の Dart 実装は clean-room 再実装。詳細は third_party/roborazzi/ を参照 |
| Noto Sans JP | SIL OFL 1.1 | assets/fonts/ 配下に同梱。Reserved Font Name: "Noto" |
| Materialize CSS | MIT | ローカル golden test レポート (build/reports/golden/index.html) が CDN 経由で読み込み。再配布なし |
| DroidKaigi/conference-app-2025 | Apache-2.0 | ワークフロー設計の参照 (出力命名・ディレクトリレイアウトの将来 CI 互換性のため)。ソースコードは借用していない |










