issue数、watcher数の表示にはSearch APIのレスポンスに含まれる「open_issues_count」および「watchers_count」を用いたが、
実装中これらから得られる値がブラウザから確認できる値と異なることに気づいた。
Search APIを利用する条件の範疇で修正しようとしたが、期限内に修正できる目処がつかなかったため保留とした。
関連issue: #50
検索ページ(Light) | 詳細ページ(Light) | 検索ページ(Dark) | 詳細ページ(Dark) |
---|---|---|---|
検索ページ(Light) | 詳細ページ(Light) | 検索ページ(Dark) | 詳細ページ(Dark) |
---|---|---|---|
Android、iOSともに 開発環境と本番環境の2種類を用意した
Android | iOS |
---|---|
バージョン | |
---|---|
Flutter | 3.0.5 |
Dart | 2.17.6 |
Dart defineを用いて環境分けをしているため、実行時に環境変数としてFLAVORを表す文字列を渡す必要がある。
ただし、Makefileを作成しコマンドを定義しているため、make~ から始まる短いコマンドでも実行が可能。
また、環境変数による環境分けのため、Codemagicを用いた自動デプロイにも簡単に対応可能。
flutter run --dart-define=FLAVOR=dev
または
make run
flutter run --dart-define=FLAVOR=prod
または
make run-prod
アーキテクチャは、Presentation層をMVVMとしたクリーンアーキテクチャとした。
Flutterプロジェクトとしては、Freezed + Riverpod + StateNotifierを用いた構成になっている。
ViewModelはStateNotifierを継承したクラス(HogePageNotifeirと命名)とし、その状態はFreezedで生成する。
APIとの通信処理は検索結果の取得のみであり、UseCaseは必要性を感じなかったため採用していない。
- ページネーションを実装し、検索結果が100件を超える場合でもListViewを底までスクロールすることで追加でリポジトリを取得してリストを更新するようにした。
- アプリ起動時に検索フィールドに自動でフォーカスするようにしたり、入力内容の確定時に検索を実行するようにするなどユーザーが快適に目的を達成できるようにした。
- アプリの環境を開発環境と本番環境に分け、環境に応じてアプリ名とアプリケーションID(Androidの場合)またはバンドルID(iOSの場合)が変更されるようにした。
- 【ライトモード / ダークモード / 端末の設定モード】という3種のモードをアプリから切り替えられるようにした。
- 上記のモードをSharedPreferencesを用いて永続化できるようにした。
- ダークモードの場合はCardの影を非表示にするなど、UIの質の向上に努めた。
- 多言語対応をおこなった。