![](/img/trans.png)
[英]How can I react to a riverpod FutureProvider by using ref.listen?
[英]How can I recall a futureprovider (riverpod) on build
我有一個簡單的頁面,其中顯示了一個產品,我正在嘗試使用 riverpod 和 futureprovider,但是 future 僅在我第一次調用 go 到該頁面時被調用?
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;
});
請用
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 上更新 UI。
使用最近的 Riverpod,您可以執行ref.refresh(userProvider)
來刷新提供程序。
有兩個選項。
請注意,如果您使用的是 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'),
));
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.