【问题标题】:Flutter Riverpod: How to trigger FutureProvider after first execution fail?Flutter Riverpod:第一次执行失败后如何触发FutureProvider?
【发布时间】:2021-04-06 11:56:27
【问题描述】:

有没有办法在第一次尝试失败时重试 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?
      },
    );
  },
);

【问题讨论】:

  • 不可以在你的onPressed中调用watch(_dataprovider)吗?
  • 实际上,你不能在Consumer的主体之外使用watch

标签: flutter riverpod


【解决方案1】:

你可以试试

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

【讨论】:

    【解决方案2】:

    我认为最适合您尝试做的事情是这样的:

    StreamProvider 和 Autodispose

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

    【讨论】:

    • 我认为这是最好的方法。无论在哪里,我都接受了另一个答案,因为它专门针对问题中提到的内容(FutureProvider)。但我更新了我的代码以使用 StreamProvider。非常感谢!
    • 别担心,很高兴我的帮助,希望你发现我的有用,快乐编码!
    猜你喜欢
    • 2021-08-22
    • 2020-11-11
    • 1970-01-01
    • 2020-12-26
    • 1970-01-01
    • 2015-09-13
    • 2014-07-05
    • 2020-11-06
    • 2013-03-01
    相关资源
    最近更新 更多