Riverpod Tutorial 03
final testFutureProvider = FutureProvider<String>((ref) async {
final dio = ref.watch(dioProdiver);
final response = await dio.get<dynamic>("https://googld.com");
return response.toString();
})
final response = watch(testFuntureProvider);
return respone.when(
data: (response) => Text(response),
loading: () => const CircularProgressIndicator(),
error: (erro, st) => Text(err.toString()),
);
기본으로 설정된 곳에 페이지가 생기는구나.
#file todo_state.dart
class TodosNotifier extends StateNotifier<AsyncValue<List<Todo>>> {
TodosNotifier(
this.read, [
AsyncValue<List<Todo>> todos,
]) : super(todos ?? const AsyncValue.loading()){
_retrieveTodos();
}
final Reader read;
AsyncValue<List<Todo>> previousState;
Future<void> _retrieveTodos() async {
try {
final todos = await read(todoRepositoryProvider).retrieveTodos();
state = AsyncValue.data(todos);
} on TodoException catch (e, st) {
state = AsyncValue.error(e,st);
}
}
}
위의 #Notifier 를 사용하면,
final todosState = watch(todosNotifierProvider.state);
return todosState.when(
data: (todos) {}
loading: () {}
error: (err, stacktrace) {}
)
#file todo_repository.dart
abstract class TodoRepository {
Future<List<Todo>> retrieveTodos();
Future<void> addTodo(String description);
Future<void> toggle(String id);
Future<void> edit({
@required String id,
@required String description,
});
Future<void> remove(String id);
}
#file todo_state.dart
final todoRepositoryProvider = Provider<TodoRepository>((ref) {
throw UnimplementedError();
})
final todosNotifierProvider = StateNotifierProvider<TodosNotifier>((ref) {
return TodosNotifier(ref.read);
})
final todoExceptionProvider = StateProvider<TodoException>((ref) {
return null;
})
...
void _cacheState() {
previousState = state.whenData((value) => value)
}
void _resetState() {
if (previousState != null) {
state = previousState;
previousState = null;
}
}
void _handleException(TodoException e) {
_resetState();
read(todoExceptionProvider).state = e
}
main.dart 에서
body: ProviderListener(
provider: todoExceptionProvider,
onChange: (
BuildContext context,
StateController<TodoException> exceptionState,
) {
Scaffold.of(context).showSnackBar(
SnackBar(
content: Text(
exceptionState.state.error.toString()
)
)
)
},
child: SafeArea(
child: TabBarView(
)
)
)