簡體   English   中英

我如何召回構建中的 futureprovider (riverpod)

[英]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)來刷新提供程序。

有兩個選項。

  1. ref.refresh(提供者)
  2. 參考無效(提供者)

請注意,如果您使用的是 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM