RiverpodのProviderを使う (Flutter)

November 01, 2022

確認環境

$ flutter --version
Flutter 3.3.4 • channel stable • https://github.com/flutter/flutter.git
Framework • revision eb6d86ee27 (3 weeks ago) • 2022-10-04 22:31:45 -0700
Engine • revision c08d7d5efc
Tools • Dart 2.18.2 • DevTools 2.15.0

pubspec.yaml

dependencies:
  ...
  flutter_hooks: ^0.18.5+1
  hooks_riverpod: ^2.0.2
  ...

Provider を使ってみる

今回のサンプルアプリについて

Providerの利用例の1つである下記を検証するコードを書いてみます。

Provider を使ってプロバイダやウィジェットの更新の条件を限定する

検証コード

lib/main.dart

import 'dart:async';

import 'package:flutter/material.dart';
import 'package:flutter_hooks/flutter_hooks.dart';
import 'package:hooks_riverpod/hooks_riverpod.dart';

void main() {
  runApp(ProviderScope(child: MyApp()));
}

final pageIndexProvider = StateProvider((ref) => 3);

final displayPreviousPageProvider = Provider((ref) {
  final page = ref.watch(pageIndexProvider);
  print(page);
  return page != 1;
});

class MyApp extends ConsumerWidget {
  // This widget is the root of your application.
  
  Widget build(BuildContext context, WidgetRef ref) {
    final notFirstPage = ref.watch(displayPreviousPageProvider);

    final page = ref.read(pageIndexProvider.notifier);

    void goToPreviousPage() {
      ref.read(pageIndexProvider.notifier).update((state) => state - 1);
    }

    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: const Text('My First app'),
        ),
        body: Column(children: [
          Text('previous page?: $notFirstPage'),
          Text('current page: ${page.state}'),
          ElevatedButton(
              onPressed: notFirstPage ? goToPreviousPage : null,
              child: const Text('back'))
        ]),
      ),
    );
  }
}

back ボタン1回目の押下

printで出力している page は 2 になります。

しかし、画面は再ビルドされていないため、表示が変わりません。

back ボタン2回目の押下

printで出力している page は 1 になります。

displayPreviousPageProvider で結果がback ボタンを押す前と変わるため、画面も再ビルドされて、表示も変わります。

参考


SHARE

Profile picture

Written by tamesuu