Skip to content

1. Riverpodとは

RiverpodはDart/Flutterで使用できる状態管理ライブラリです。 Remi Rousselet 氏によって作成されており、Riverpodの他に「freezed」「flutter_hooks」なども作成されております。 「Provider」についても同氏が作成している状態管理ライブラリですが、公式FAQにおいても「多分、Providerは非推奨にする予定で、Riverpodへの移行ツールも計画している」とのことで、作者自身もRiverpodの使用を推奨しております。 ちなみにRiverpodはProviderのアナグラムです。

1.1: Riverpodのメリット

Flutterの状態管理手法はStatefulWidgetPatternをはじめ、様々あります。 その中でRiverpodを使用するメリットは以下が挙げられると考えております。

  • 複数のWidgetから状態にアクセスができる
  • keepAliveやautoDisposeにより、安全に破棄ができる
  • Consumer等を適切に使用することでパーフォマンスの向上(Widgetの再構築)に繋がる/selectによるスコープの絞り込みもできる
  • 複数のProvider(状態)を噛み合わせることができる
  • riverpod_generatorと併用することでclassやmethodの記法でProvderを作成できる
  • DIもしやすく、テストの容易性の向上に繋がる(Override)
  • Flutter Favoriteである

1.2: Riverpodの使い方

以下は公式ドキュメントのサンプルからriverpod_generatorを使用しない形式に修正したものです。

dart

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

// String の状態を取り扱いたい場合、以下のように記載します。
final helloWorldProvider = StateProvider<String>((ref) => 'Hello world');

// main.dartのrunAppの部分でProviderScopeを入れ込みます。
// ProviderScopeで囲うことによりアクセスが可能となります。
void main() {
  runApp(
    ProviderScope(
      child: MyApp(),
    ),
  );
}

// providerを使用するWidgetでは基本的にStatelessWidgetの代わりにConsumerWidgetを使用します。
// 利用したいproviderをref.watchで参照することで状態を取り扱うことが可能です。
class MyApp extends ConsumerWidget {
  @override
  Widget build(BuildContext context, WidgetRef ref) {
    final String value = ref.watch(helloWorldProvider);

    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(title: const Text('Example')),
        body: Center(
          child: Text(value),
        ),
      ),
    );
  }
}

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

// String の状態を取り扱いたい場合、以下のように記載します。
final helloWorldProvider = StateProvider<String>((ref) => 'Hello world');

// main.dartのrunAppの部分でProviderScopeを入れ込みます。
// ProviderScopeで囲うことによりアクセスが可能となります。
void main() {
  runApp(
    ProviderScope(
      child: MyApp(),
    ),
  );
}

// providerを使用するWidgetでは基本的にStatelessWidgetの代わりにConsumerWidgetを使用します。
// 利用したいproviderをref.watchで参照することで状態を取り扱うことが可能です。
class MyApp extends ConsumerWidget {
  @override
  Widget build(BuildContext context, WidgetRef ref) {
    final String value = ref.watch(helloWorldProvider);

    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(title: const Text('Example')),
        body: Center(
          child: Text(value),
        ),
      ),
    );
  }
}

コントリビューター

ちっぴー

ちっぴー

FlutterとFirebaseをよく扱っており、Riverpodは重宝しております!ハンズオンを通して学びを一緒に深めていきましょう👾