概要
約半年間、独学でFlutterを勉強しました。
自分なりに開発の型が見えてきたのでGitのリポジトリと記事を残したいと思います。
本記事はそのInfrastructure層編です。
flutterプロジェクトの開始時に作成されるサンプルアプリを置き換えたもので、基本的な仕様やUIは一緒ですが、カウントを1つ進めるたびにsharedPreferencesに現在のカウントが保存されるようになっています。
デザインパターン
こちらの大変わかりやすい記事を参考にさせていただきました!
レイヤードアーキテクチャに関しては、こちらの記事内で詳しく(かつ非常にわかりやすく!)説明がされているので、こちらをご参照ください。
ディレクトリ構成
lib
├ features/
│ ├ common_utils/
│ └ #feature-1
│ ├ application/
│ ├ domain/
│ └ infrastructure/
├ presentation/
└ main.dart
Infrastructure
この層にはDomain層編と概要編で触れた、抽象クラスをImplementsした機能実装済みのRepoitoryが配置されます。
また、DB操作で使用するテーブルキーなどの定数を管理するクラスも配置しています。
// repository内で使用するキーやフィールド名などの定数を定義するクラス
class CounterConstants {
//fieldName
final String countKey = 'count';
}
このシンプルなテンプレートアプリではCountをSharedPreferencesに保存するRepositoryしかありませんが、実際のアプリではDBとの通信や広告の取得などもRepositoryを通じて通信していく形になるかと思います。
アプリ外との通信は基本的にRepositoryから行うという認識で開発しています。
Mock
mockのRepositoryをproviderにoverrideすると、バックエンドとフロントエンドの開発を別々に進めることができるというメリットがあるようです。
//開発時に利用するモックのrepository
class MockCountRepository implements CounterRepository {
@override
Future<Count?> fetch() async {
return CountCreator.create();
}
@override
Future<void> saveCount(Count count) async {}
}
フロントエンドの開発では、このようにmockで適当な値を返してあげればバックエンドの開発が終わっていない個所でもエラーを出さずに開発を進めることができます。
テストもしやすくなるっぽいです。
おわりに
Infrastructure層編は以上になります。
以下の記事も併せてよろしくお願いします!