【Flutter】Flutter Riverpodについて
はじめに
今回はFlutterで使用されている状態管理パッケージのRiverpodについて書いていきたいと思います。
Flutter Riverpodとは
Riverpodは、状態管理するパッケージで様々なウィジェットにデータを提供することができます。ウィジェットが多層のネストになっても簡単にデータを取得することができます。
Flutter Riverpodの使い方
以下に簡単なFlutter Riverpodの使い方を書いていきます。(flutter create 〇〇で生成されたサンプルコードから変更して試しています。)
Provider(変更不可のデータ管理)
pubspec.yamlに以下を追加します。
dependencies:
flutter:
sdk: flutter
flutter_riverpod: ^1.0.4
main.dartのMyApp()をProviderScope()の中に入れます。
import 'package:flutter_riverpod/flutter_riverpod.dart';
void main() {
runApp(const ProviderScope(child: MyApp()));
}
MyHomePageクラスを削除します。
_MyHomePageStateクラス→MyHomePageクラス(ConsumerWidgetを継承)に名前を変えて、以下のように変更します。
// 追加
final strProvider = Provider((_) {
return 'Hello World';
});
class MyHomePage extends ConsumerWidget {
@override
Widget build(BuildContext context, WidgetRef ref) {
final value = ref.watch(strProvider); // 追加
return Scaffold(
appBar: AppBar(
backgroundColor: Theme.of(context).colorScheme.inversePrimary,
title: const Text("riverpod"),
),
body: Center(
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: <Widget>[
const Text(
'You have pushed the button this many times:',
),
Text(
value, // 変更
style: Theme.of(context).textTheme.headlineMedium,
),
],
),
),
);
}
}
上記のようにすると、strProviderが提供している”Hello World”(変更不可の文字列)を取得することができます。
StateNotifierProvider(変更可のデータ管理)
状態と状態を変更するメソッドを追加します。(以下文字列の状態管理と変更)
// 追加
class StrNotifier extends StateNotifier<String> {
StrNotifier() : super('');
void changeStr(String str) {
state = str;
}
}
以下のように変更すると外部からデータの状態を変更をすることができます。
strStateControllerのメソッドで状態を変更するとウィジットが再描画されます。
// 追加
final strNotifierProvider =
StateNotifierProvider<StrNotifier, String>((_) => StrNotifier());
class MyHomePage extends ConsumerWidget {
TextEditingController controller = TextEditingController();
@override
Widget build(BuildContext context, WidgetRef ref) {
final strStateController =
ref.watch(strNotifierProvider.notifier); // 変更のとき使う
final str = ref.watch(strNotifierProvider); // 表示のとき使う
return Scaffold(
appBar: AppBar(
backgroundColor: Theme.of(context).colorScheme.inversePrimary,
title: const Text("riverpod"),
),
body: Center(
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: <Widget>[
Text(
str, // 変更
style: Theme.of(context).textTheme.headlineMedium,
),
TextField(
controller: controller,
),
ElevatedButton(
onPressed: () {
strStateController.changeStr(controller.text); // 変更
},
child: const Text('変更'),
),
],
),
),
);
}
おわりに
Riverpodのパッケージについて書きました。
他の種類のデータを管理するProviderがあるので、勉強していきたいです。
またFlutterのメジャーなパッケージの使い方など理解を深めていけたらいいなと思います。
この記事が気に入ったらサポートをしてみませんか?