万年素人からHackerへの道

万年素人がHackerになれるまで殴り書きするぜ。

クリーンアーキテクチャ Riverpod Flutter

クリーンアーキテクチャに基づいたFlutterアプリの雛形を作成するには、以下の手順に従うことができます。

  1. プロジェクトを作成する Flutterコマンドラインツールを使用して、新しいFlutterプロジェクトを作成します。例えば、以下のコマンドを使用することができます。
flutter create --org com.example myapp

このコマンドは、myappという名前のFlutterプロジェクトを作成し、com.exampleのような組織名を指定します。これは、AndroidアプリケーションIDに使用されます。

  1. プロジェクトの構成を決定する

次に、アプリケーションの構成を決定する必要があります。これは、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のサブフォルダがあります。これらのサブフォルダには、それぞれ、データ層、ドメイン層、プレゼンテーション層、およびユーティリティクラスが格納されます。

  1. Riverpodを導入する

FlutterアプリでRiverpodを使用するには、flutter_riverpodパッケージを使用する必要があります。pubspec.yamlファイルに以下を追加して、flutter_riverpodパッケージをインストールします。

dependencies:
  flutter_riverpod: ^1.0.3
  1. 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--;
  }
}
  1. このように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つのボタンを提供します。

  1. アプリケーションのエントリーポイントを作成する 最後に、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の設定方法を調整する必要があります。