본문 바로가기

개발하자

플러터 리버팟: 첫 번째 실행이 실패한 후 FutureProvider를 트리거하는 방법은 무엇입니까?

반응형

플러터 리버팟: 첫 번째 실행이 실패한 후 FutureProvider를 트리거하는 방법은 무엇입니까?

첫 번째 시도가 실패했을 때 FutureProvider를 다시 시도할 수 있는 방법이 있습니까?

공급자:

final _dataProvider = FutureProvider((ref) => ref.watch(productRepositoryProvider).fetchProducts());

소비자:

return watch(_dataProvider).when(
  data: (value) {
    return Text('Ok');
  },
  loading: () => const CircularProgressIndicator(),
  error: (error, stackTrace) {    
    return FlatButton(
      child: Text('Retry'),
      onPressed: () {
        // What should I add here to retry this FutureProvider?
      },
    );
  },
);



나는 당신이 하려는 것에 대한 가장 적절한 접근법은 다음과 같은 것이라고 생각한다:

StreamProvider 및 자동 폐기

final productRepositoryProvider =
    Provider<IProductRepository>((ref) => ProductRepository());

final allProductProvider =
    StreamProvider.autoDispose<List<ProductModel>>((ref) {
  final _productRepository = ref.watch(productRepositoryProvider);
  return _productRepository.allProductsStream;
});




해볼 수 있다

onPressed: () {
        context.refresh(_dataProvider);
      },



다른 대답들은 구식이다. 대신 사용:

ref.invalidate(yourProvider);

'제공자의 상태를 무효화하여 새로 고침을 발생시킵니다.

[refresh](새로 고침)과는 달리 새로 고침은 즉각적이지 않으며 대신 다음 읽기 또는 다음 프레임으로 지연됩니다.

[무효]를 여러 번 호출하면 공급자가 한 번만 새로 고쳐집니다.

[무효]를 호출하면 공급자가 즉시 처리됩니다.

만약 초기화되지 않은 공급자에게 사용된다면, 이 방법은 효과가 없을 것이다.'

공급자와 동일한 ProviderScope에서 이를 호출해야 합니다!


반응형