我想使用 pull 刷新从 Riverpod 模型提供者构建的 Listview,该提供者从 Future Provider 获取数据

问题描述

   body: Container(
            child: Consumer(builder: (context,watch,child) {
              var wallet = watch(walletBuilderProvider);
              //print(wallet.allWalletItems[0].eventName);
              return WalletList(wallets: wallet.allWalletItems);
            }),)
final walletBuilderProvider =
    ChangeNotifierProvider.autodispose<WalletModel>((ref) {
  final walletData = ref.watch(dataProvider);
  // Create an object by calling the constructor of WalletModel
  // Since we Now have memory allocated and an object created,we can Now call functions which depend on the state of an object,a "method"
  final walletModel = WalletModel();
  walletModel.buildWallet(walletItems: walletData);
  return walletModel;
});

我最初在加载之前刷新所有数据所做的只是调用

context.refresh(dataProvider);
    context.refresh(walletBuilderProvider);

这是被调用显示数据的列表。

class WalletList extends StatelessWidget {
  final List<Wallet> wallets;

  WalletList({required this.wallets});

  @override
  Widget build(BuildContext context) {
    return Container(
        child: wallets.isEmpty
            ? Container(
                height: 150,child: Center(
                  child: Text(
                    "List is empty",style: TextStyle(fontSize: 18,color: Colors.white),),)
            : getWalletListItems());
    // return ListView(
    //   children: getWalletListItems(),// );
  }

  ListView getWalletListItems() {
    print(wallets.length);
    print("afterwallets");
    var walletList = wallets
        .map((walletItem) => WalletListItem(wallet: walletItem))
        .toList();
    return ListView.builder(
        itemCount: walletList.length,physics: BouncingScrollPhysics(),itemBuilder: (context,index) {
          double scale = 1.0;
          return Opacity(
            opacity: scale,child: Align(
                heightFactor: 0.7,alignment: Alignment.topCenter,child: walletList[index]),);
        });
  }
}

我最终想要做的是使用某种形式的 Refreshindictator 来刷新两个提供程序,但是当我尝试在 Consumer 或 WalletList 中实现它时,我根本没有看到任何变化。

>

解决方法

首先 walletBuilderProvider 观看 dataProvider,因此您只需要刷新 dataProvider,这将强制刷新所有依赖它的提供程序

您是否尝试过使用 RefreshIndicator 小部件?

RefreshIndicator(
   onRefresh: () async => context.refresh(dataProvider),child: WalletList(wallets: wallet.allWalletItems),);