Как мне вспомнить будущего провайдера (riverpod) на сборке
У меня есть простая страница, на которой показан продукт, и я пытаюсь использовать riverpod и futureprovider, но будущее называется только при первом переходе на страницу?
final productInfo = FutureProvider<Map<String, dynamic>>((ref) async {
final response =
await http.get('https://www.api.com/$clickedID');
final content = json.decode(response.body) as Map<String, dynamic>;
return content;
});
4 ответа
С недавним Riverpod вы можете
ref.refresh(userProvider)
обновить провайдера.
Есть два варианта.
- ref.refresh(поставщик)
- ref.invalidate(поставщик)
Обратите внимание, что если вы используете AsyncValue, старый результат будет возвращен при обновлении FutureProvider, а для AsyncValue.isRefreshing будет установлено значение true:
final notificationRepositoryProvider = FutureProvider<bool?>((ref) async {
Future<bool> approveDocument() => Future.delayed(Duration(seconds: 1), () => Future.value(Random().nextBool()));
return approveDocument();
});
class HomeView extends ConsumerStatefulWidget {
const HomeView({Key? key}) : super(key: key);
@override
HomeViewState createState() => HomeViewState();
}
class HomeViewState extends ConsumerState<HomeView> {
@override
Widget build(BuildContext context) {
AsyncValue<bool?> rejectResponse = ref.watch(notificationRepositoryProvider);
return ElevatedButton(
onPressed: () {
// ref.refresh(notificationRepositoryProvider);
ref.watch(notificationRepositoryProvider).;
},
child: rejectResponse.when(
loading: () => const CircularProgressIndicator(
color: Colors.white,
),
skipLoadingOnRefresh: false,
error: (err, stack) => Text('Error'),
data: (data) => Text('Yes: $data'),
));
}
}
Пожалуйста, используйте
final userProvider = StreamProvider<User>(
final response =
await http.get('https://www.api.com/$clickedID');
final content = json.decode(response.body) as Map<String, dynamic>;
return content;
);
теперь вы можете слушать провайдера, используя
watch
,
AsyncValue<User> user = watch(userProvider);
Нет встроенных функций, но вы можете переопределить значение с таким же будущим позже.
recallProductInfoFutureProvider() {
final response = http.get('https://www.api.com/$clickedID');
final content = json.decode(response.body) as Map<String, dynamic>;
productInfo.overrideWithValue(content)
}
Рассмотрите возможность использования с StreamProvider и наблюдения внутри Consumer для обновления пользовательского интерфейса overrideWithValue.