万年素人からHackerへの道

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

  • ・資産運用おすすめ
    10万円は1000円くらい利益
    資産運用ブログ アセマネ
    • ・寄付お願いします
      YENTEN:YYzNPzdsZWqr5THWAdMrKDj7GT8ietDc2W
      BitZenny:ZfpUbVya8MWQkjjGJMjA7P9pPkqaLnwPWH
      c0ban:8KG95GXdEquNpPW8xJAJf7nn5kbimQ5wj1
      Skycoin:KMqcn7x8REwwzMHPi9fV9fbNwdofYAWKRo

    クリーンアーキテクチャ 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の設定方法を調整する必要があります。