🙈

【Flutter】プレーンなクラスでStateProviderを更新する【Riverpod】

2022/04/07に公開

概要

StatelessWidgetやStatefulWidgetを書き換えてRiverpodのStateProviderを更新する方法はよく見かけるんですが、
何も継承していないプレーンなクラスでStateProviderを更新しようとしたときにちょっとつまづいたので、ちょっとメモしときます。

やり方

sample.dart
import 'package:flutter_riverpod/flutter_riverpod.dart';

final sampleProvider = StateProvider<String>((ref) => 'ほげほげ');

class Sample {

	static void update() {
	    // StateProviderを更新する
	    StateProvider((ref) {
	      ref.read(sampleProvider.notifier).state = 'ふがふが';
	    });
	}
}

ドキュメント見たら一番上に書いてありました。
ドキュメントを読もう(戒め)

https://riverpod.dev/ja/docs/concepts/reading

4/10追記 『ごめん、できなかった。』

値を更新できたと思ったのは勘違いだったみたいです。
やはりConsumerWidgetConsumerStatefulWidgetを継承したクラス内でないとStateProviderを更新できないっぽい?でした。
記事を消そうと思いましたが、「できない」というのも大事な情報かなと思ったので残しておきます。

サービスクラスからStateProviderの値を利用したい場合、
たとえば、サービスクラスからAPIサーバーへリクエストを送る際に、StateProviderで管理している値をパラメーターとして使いたいような場合では、
利用する値は、Shared Preferenceflutter secure storage のようなローカルストレージに保存しておくのが良さそうです。
自分はそうしました。

https://pub.dev/packages/shared_preferences

https://pub.dev/packages/flutter_secure_storage

間違っていたら、あるいは何か助言などがあればぜひ教えてください!!

Discussion