LoginSignup
0
0

Flutter 〜riverpodを使って極シンプルなカウンターアプリ〜

Posted at

riverpodを使った標準アプリよりもさらにシンプルなカウンターアプリ。
全体のコードの後にポイントごとに説明をしていく。

import 'package:flutter/material.dart';
import 'package:flutter_riverpod/flutter_riverpod.dart';

// プロバイダの定義
// StateProviderは状態管理を行うプロバイダで、ここでは整数型のカウンターを管理
final counterProvider = StateProvider<int>((ref) => 0);

void main() {
  runApp(
    // ★★★★①ProviderScopeはプロバイダの範囲を定義し、アプリ全体でプロバイダを利用可能にする★★★★
    ProviderScope(
      child: MyApp(),
    ),
  );
}

// MyAppはアプリケーションのルートウィジェット
class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      // アプリのホーム画面をCounterWidgetに設定
      home: CounterWidget(),
    );
  }
}

// ★★★★②CounterWidgetはConsumerWidgetを継承し、プロバイダの状態を消費するウィジェット★★★★
class CounterWidget extends ConsumerWidget {
  @override
  Widget build(BuildContext context, WidgetRef ref) {
    // ★★★★③ref.watchを使ってcounterProviderの状態を監視し、現在のカウント値を取得★★★★
    final count = ref.watch(counterProvider);

    return Scaffold(
      // アプリの上部に表示されるアプリバーの設定
      appBar: AppBar(title: Text('Counter')),
      // 中央に配置されるカウント値を表示するテキストウィジェット
      body: Center(
        child: Text(
          '$count', // カウント値を表示
          style: TextStyle(fontSize: 40), // テキストのスタイルを設定
        ),
      ),
      // 右下に配置されたFloatingActionButton
      // ボタンが押されるとカウントが増える
      floatingActionButton: FloatingActionButton(
        onPressed: () {
          // ★★★★④ref.readを使ってcounterProviderのnotifierを取得し、stateを更新★★★★
          ref.read(counterProvider.notifier).state++;
        },
        // ボタンに表示されるアイコンを設定
        child: Icon(Icons.add),
      ),
    );
  }
}

import部分

//flutter/material.dartはFlutterのマテリアルデザインのウィジェットをインポート
import 'package:flutter/material.dart';
//flutter_riverpod/flutter_riverpod.dartはRiverpodのプロバイダ機能をインポート
import 'package:flutter_riverpod/flutter_riverpod.dart';

Provider部分

//StateProviderは整数型の状態を管理
//初期値は0
final counterProvider = StateProvider<int>((ref) => 0);

main関数

void main() {
  //ProviderScopeでラップされたMyAppウィジェットをrunAppで実行
  runApp(
    //ProviderScopeはプロバイダの範囲を定義
    ProviderScope(
      child: MyApp(),
    ),
  );
}

MyAppウィジェット

//MyAppはアプリのルートウィジェットで、ホーム画面としてCounterWidgetを設定
class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: CounterWidget(),
    );
  }
}

CounterWidget

//CounterWidgetはConsumerWidgetを継承し、プロバイダの状態を監視
class CounterWidget extends ConsumerWidget {
  @override
  Widget build(BuildContext context, WidgetRef ref) {
    final count = ref.watch(counterProvider);

    return Scaffold(
      appBar: AppBar(title: Text('Counter')),
      body: Center(
        child: Text(
          //ref.watch(counterProvider)でカウント値を取得し、テキストとして表示
          '$count',
          style: TextStyle(fontSize: 40),
        ),
      ),
      floatingActionButton: FloatingActionButton(
        onPressed: () {
          //FloatingActionButtonが押されると、
          //ref.read(counterProvider.notifier).state++でカウント値が1増加する。
          ref.read(counterProvider.notifier).state++;
        },
        child: Icon(Icons.add),
      ),
    );
  }
}
0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0