flutter中使用riverpod onClick监听器调用api调用

问题描述 投票:0回答:1

我正在尝试使用 dio 调用相同的 api 调用并使用 Riverpod 监听该 api 调用,但问题是当我在构建函数中调用 api 调用时,它可以工作,但是当我使用 a 调用相同的 api 调用时不同的参数,调用时它不会刷新用户界面,尝试了 ref.invalidate() 和 ref.read() 但没有运气,我很乐意获得一些帮助,谢谢。

  • 这就是我在构建函数中调用api的方式

var data = ref.watch(getAllProductsProvider(Utils.categoriesNames[0].toLowerCase()));

  • 这是我调用 api onClick 的地方

Widget buildCards(BuildContext context){
    return SizedBox(
      height: 120,
      child: ListView.builder(
        shrinkWrap: true,
        scrollDirection: Axis.horizontal,
        itemCount: Utils.categories.length,
        itemBuilder: (context, index) {
          return Card(
            color: Colors.grey.shade100,
            shape: RoundedRectangleBorder(
              borderRadius: BorderRadius.circular(16),
              side: BorderSide(
                color: selectedCategory == index ? Colors.orange : Colors.transparent,
              ),
            ),
            child: GestureDetector(
              onTap: () {
                setState(() {
                  selectedCategory = index;
                });
                        ref.invalidate(getAllProductsProvider(Utils.categoriesNames[index].toLowerCase()));
              },
              child: Padding(
                padding: const EdgeInsets.only(left: 15,right: 15,top: 10,bottom: 10),
                child: Column(
                  mainAxisAlignment: MainAxisAlignment.center,
                  mainAxisSize: MainAxisSize.min,
                  children: [
                    Image.asset(
                      Utils.categories[index],
                      width: 40,
                      height: 40,
                    ),
                    const SizedBox(height: 5),
                    Text(
                      categoriesNamesY[index],
                      style: AppFonts.getFont().copyWith(fontSize: 20),
                    ),
                  ],
                ),
              ),
            ),
          );
        },
      ),
    );
  }

flutter riverpod
1个回答
0
投票

您似乎仅使特定参数的提供程序无效。 下面的示例来自有关接收参数的提供者无效的 Riverpod 文档。

void onTap() {
  // Invalidate all possible parameter combinations of this provider.
  ref.invalidate(labelProvider);
  // Invalidate a specific combination only
  ref.invalidate(labelProvider('John'));
}
© www.soinside.com 2019 - 2024. All rights reserved.