728x90
invalidate
final countProvider = StateProvider((ref) => 0);
class HomePage extends ConsumerWidget {
const HomePage({Key? key}) : super(key: key);
@override
Widget build(BuildContext context, WidgetRef ref) {
print("HomePage Build");
return Scaffold(
body: Center(
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: [
Text("Hello World"),
Consumer(
builder: (context, ref, widget) {
print("Consumer Build");
final count = ref.watch(countProvider);
return Text(count.toString());
},
),
Row(
mainAxisAlignment: MainAxisAlignment.center,
children: [
ElevatedButton(
onPressed: () {
ref.invalidate(countProvider);
},
child: Text("초기화 버튼")),
ElevatedButton(
onPressed: () {
ref
.read(countProvider.notifier)
.update((state) => ++state);
},
child: Text("플러스 버튼")),
],
),
],
),
),
);
}
}
이전 글의 코드에서 초기화 버튼만 추가했습니다.
초기화 버튼을 누르면 ref.invalidate(초기화 시킬 프로바이더) 가 호출됩니다.
메소드가 호출되면 처음 초기화를 했던것처럼 다시 초기화를 진행합니다.
그래서 해당 프로바이더의 처음 초기화는 0이였기 때문에 0으로 변경된 모습입니다.
refresh
invalidate 와 refresh는 비슷한 동작을 합니다.
위에 코드의 invalidate를 refresh로 바꿔도 동일하게 작동합니다.
차이점은 무엇일까요?
공식문서에서는 invalidate를 사용하면 프로바이더가 빠르게 두번 재빌드 되는것을 방지한다고 합니다.
그래서 refresh보다 안전하다고 적혀있습니다.
다른 차이점은 반환값을 신경쓰지 않는다면 invalidate를 사용하고 / 반환값을 신경쓴다면 refresh를 사용하라고 적혀있습니다.
예시로 해당 코드가 있습니다.
코드를 살펴보면 FutreProvider 비동기를 다루는 프로바이더가 보입니다.
해당부분에서 비동기 처리를 하고 값을 반환해주는것을 확인할 수 있습니다.
Example에서 build가 될때마다 프로바이더를 초기화 해주고 그 값을 화면에 보여줍니다.
이때 프로바이더를 초기화 할 때 비동기 처리로 작업을 해서 그 값을 화면에 보여주기에
반환값을 신경쓴다고 할 수 있을것 같습니다.
'Flutter > Riverpod' 카테고리의 다른 글
[Flutter] StateNotifier / Riverpod 사용해서 앱 만들어보기. (2) | 2023.02.01 |
---|---|
Flutter) Riverpod Consumer 사용하기 - 5 (0) | 2023.01.22 |
Flutter) Riverpod watch,listen,read 사용하기 - 4 (0) | 2023.01.21 |
Flutter) Riverpod "ref" 얻기 - 3 (0) | 2023.01.21 |
Flutter) Riverpod 프로바이더란? - 2 (0) | 2023.01.21 |