Flutter 상태관리 (RiverPod)
2022. 6. 24. 00:00ㆍFlutter
반응형
RiverPod
: Provider 의 단점을 제거한 상태관리 plugin
(Provider 를 대체 한다기는 보다는 단점을 보완하고 확장한 확장라이브러리로 보는게 좋다.)
flutter pub add flutter_riverpod
flutter pub get
counter app 을 riverpod 를 이용해서 다시 작성해 보자
counter_riverpod.dart
import 'package:flutter/material.dart';
import 'package:flutter_riverpod/flutter_riverpod.dart';
final counterProvider = StateNotifierProvider(
(ref) => CounterRiverpod(0)
);
class CounterRiverpod extends StateNotifier<int>{
CounterRiverpod(super.state);
void increment() => ++state;
void decrement() => --state;
}
StateNotifier<int> 를 상속하여 CounterRiverpod 를 생성하고 increment 와 decrement 를 구현한다.
생성된 CounterRiverpod (이름은 아무래도 좋다) 를 StateNotifierProvider 와 연결한다.
main.dart
import 'package:flutter/material.dart';
import 'package:flutter_riverpod/flutter_riverpod.dart';
import 'package:flutter3/riverpod/counter_page.dart';
void main() {
runApp(
ProviderScope(
child: MainApp(),
),
);
}
....
ProviderScope 를 최상위에 올려서 app 을 감싸게 한다.
counter_page.dart
import 'package:flutter/material.dart';
import 'counter_riverpod.dart';
import 'package:flutter_riverpod/flutter_riverpod.dart';
class MainApp extends StatelessWidget {
const MainApp({Key? key}) : super(key: key);
@override
Widget build(BuildContext context) {
return const MaterialApp(
home: CounterPage()
);
}
}
class CounterPage extends ConsumerWidget {
const CounterPage({Key? key}) : super(key: key);
@override
Widget build(BuildContext context, WidgetRef ref) {
return Scaffold(
appBar: AppBar(title: const Text('Counter Bloc')),
body: Center(
child: Consumer(
builder: (context, ref, _) {
final count = ref.watch(counterProvider).toString();
return Text(count, style: Theme.of(context).textTheme.headline1);
}
)
),
floatingActionButton: Column(
crossAxisAlignment: CrossAxisAlignment.end,
mainAxisAlignment: MainAxisAlignment.end,
children: [
FloatingActionButton(
child: const Icon(Icons.add),
onPressed: () => ref.read(counterProvider.notifier).increment(),
),
const SizedBox(height: 4),
FloatingActionButton(
child: const Icon(Icons.remove),
onPressed: () => ref.read(counterProvider.notifier).decrement(),
),
],
),
);
}
}
ConsumerWidget 을 상속받게 하고 WidgetRef ref 를 build 함수의 parameter 에 추가한다.
buid(... , WidgetRef ref)
Text 에 counter 를 표시하기 위해 Consumer 를 이용한다.
ref.watch 를 통해 count 를 받아온다.
button 의 onPressed 에서 동작을 정의한다.
ref.read 를 통해 increment 와 decrement 를 호출한다.
관련영상
반응형
'Flutter' 카테고리의 다른 글
Flutter 상태관리 (Provider) (0) | 2022.06.24 |
---|---|
Flutter 상태관리 (Flutter-bloc) (0) | 2022.06.22 |
Flutter 상태관리 (Bloc - bloc) (0) | 2022.06.21 |
Flutter 상태관리 (Bloc - Cubit) (0) | 2022.06.20 |
다른 위젯으로 Data 전달 (passing-data) (0) | 2022.06.17 |