クリーンアーキテクチャに基づいたFlutterアプリの雛形を作成するには、以下の手順に従うことができます。
- プロジェクトを作成する Flutterコマンドラインツールを使用して、新しいFlutterプロジェクトを作成します。例えば、以下のコマンドを使用することができます。
flutter create --org com.example myapp
このコマンドは、myappという名前のFlutterプロジェクトを作成し、com.exampleのような組織名を指定します。これは、AndroidアプリケーションIDに使用されます。
- プロジェクトの構成を決定する
次に、アプリケーションの構成を決定する必要があります。これは、Clean Architectureの基本原則に従う必要があります。これには、以下のコンポーネントが含まれます。
- Domain Layer(ドメイン層):ビジネスロジックを含むコードが格納されます。
- Data Layer(データ層):永続化やネットワーク通信など、データの取得と保存を担当するコードが格納されます。
Presentation Layer(プレゼンテーション層):UIを担当するコードが格納されます。
プロジェクトのフォルダ構成を作成する
プロジェクトのフォルダ構成を作成することで、Clean Architectureの原則に従うことができます。以下のような構成を使用することができます
- lib
- data
- models
- repositories
- sources
- domain
- entities
- repositories
- usecases
- presentation
- pages
- widgets
- main.dart
- utils
この構成では、libフォルダに、data、domain、presentation、utilsのサブフォルダがあります。これらのサブフォルダには、それぞれ、データ層、ドメイン層、プレゼンテーション層、およびユーティリティクラスが格納されます。
- Riverpodを導入する
FlutterアプリでRiverpodを使用するには、flutter_riverpodパッケージを使用する必要があります。pubspec.yamlファイルに以下を追加して、flutter_riverpodパッケージをインストールします。
dependencies: flutter_riverpod: ^1.0.3
- Providerを設定する
libフォルダにproviders.dartというファイルを作成し、このファイルにProviderを設定します。以下は、例として、ドメイン層にあるカウンターの初期値を管理するCounterRepositoryクラスを示しています。
import 'package:flutter_riverpod/flutter_riverpod.dart';
final counterRepositoryProvider = Provider((_) => CounterRepository());
class CounterRepository {
int _count = 0;
int get count => _count;
void increment() {
_count++;
}
void decrement() {
_count--;
}
}
- このようにProviderを定義することで、CounterRepositoryのインスタンスを使用できるようになります。
Riverpodを使用するウィジェットを作成する lib/presentation/pagesフォルダに新しいウィジェットを作成し、flutter_riverpodパッケージのConsumerウィジェットを使用して、Providerを使用します。以下は、例として、CounterPageクラスを示しています。
import 'package:flutter/material.dart';
import 'package:flutter_riverpod/flutter_riverpod.dart';
import 'package:myapp/data/repositories/counter_repository.dart';
class CounterPage extends ConsumerWidget {
const CounterPage({Key? key}) : super(key: key);
@override
Widget build(BuildContext context, ScopedReader watch) {
final counterRepository = watch(counterRepositoryProvider);
return Scaffold(
appBar: AppBar(title: const Text('Counter')),
body: Center(
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: [
Text(
'Count: ${counterRepository.count}',
style: Theme.of(context).textTheme.headline4,
),
const SizedBox(height: 16),
ElevatedButton(
onPressed: () => counterRepository.increment(),
child: const Text('Increment'),
),
const SizedBox(height: 8),
ElevatedButton(
onPressed: () => counterRepository.decrement(),
child: const Text('Decrement'),
),
],
),
),
);
}
}
このウィジェットは、CounterRepositoryを使用して、カウンターの値を表示し、増減するための2つのボタンを提供します。
- アプリケーションのエントリーポイントを作成する 最後に、lib/presentation/main.dartファイルを作成し、アプリケーションのエントリーポイントを作成します。以下は、例として、CounterPageを使用するMyAppクラスを示しています。
import 'package:flutter/material.dart';
import 'package:flutter_riverpod/flutter_riverpod.dart';
import 'package:myapp/presentation/pages/counter_page.dart';
void main() {
runApp(ProviderScope(child: MyApp()));
}
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
title: 'My App',
theme: ThemeData(primarySwatch: Colors.blue),
home: const CounterPage(),
);
}
}
このように、ProviderScopeを使用してアプリケーションをラップすることで、アプリケーション全体でProviderを使用できるようになります。また、MyAppクラスでは、CounterPageをホーム画面として使用するように設定されています。
以上が、クリーンアーキテクチャに基づいたFlutterアプリの雛形を作成する手順です。これにより、アプリケーションの構造を整理し、可読性とメンテナンス性を向上させることができます。ただし、アプリケーションの規模や要件に応じて、フォルダ構成やProviderの設定方法を調整する必要があります。