Riverpod은 Provider의 후속작으로 Flutter/Dart를 위한 상태관리 프레임워크이다.
자동으로 fetch(가져오고), cache(캐싱하고), combine(조합하고), 네트워크 요청을 recomputate(재계산하고), 에러를 처리할수 있다.
Riverpod은 Compile Safe
: 더이상 ProviderNotFountException과 같은 Error를 받지 않는다.
Flutter에 의존적이지 않다.
: 따라서, BuildContext를 사용할 필요가 없다.
devtool에서 상태를 확인할 수 있다.
State를 캡슐화 하는 object이다.
$ flutter pub add hooks_riverpod dev:custom_lint dev:riverpod_lint riverpod_annotation dev:build_runner dev:riverpod_generator
analyzer:
plugins:
- custom_lint
import 'package:flutter_hooks/flutter_hooks.dart';
import 'package:hooks_riverpod/hooks_riverpod.dart';
import 'package:riverpod_annotation/riverpod_annotation.dart';
Widget에서 Provider들을 Read/Listen하기 위해서는 전체 Application을 ProviderScope()로 감싸야한다.
runApp(
const ProviderScope(
child: MyApp(),
),
);
Riverpod 2.0에서 제공하는 Provder들을 알아보자.
ref.watch를 이용하여 동기화 동작을 제공하는 강력한 도구이다.
Provider의 기술적 한계를 극복하고자 Riverpod이 만들어졌다.
class Counter extends ChangeNotifier {
...
}
void main() {
runApp(
MultiProvider(
providers: [
ChangeNotifierProvider<Counter>(create: (context) => Counter()),
],
child: MyApp(),
)
);
}
// Providers are now top-level variables
final counterProvider = ChangeNotifierProvider<Counter>((ref) => Counter());
void main() {
runApp(
// This widget enables Riverpod for the entire project
ProviderScope(
child: MyApp(),
),
);
}
Provider<Model>(...);
class Example extends StatelessWidget {
Widget build(BuildContext context) {
Model model = context.watch<Model>();
}
}
final modelProvider = Provider<Model>(...);
class Example extends ConsumerWidget {
Widget build(BuildContext context, WidgetRef ref) {
Model model = ref.watch(modelProvider);
}
}
Provider<Model>(...);
Consumer<Model>(
builder: (BuildContext context, Model model, Widget? child) {
}
)
final modelProvider = Provider<Model>(...);
Consumer(
builder: (BuildContext context, WidgetRef ref, Widget? child) {
Model model = ref.watch(modelProvider);
}
)