我刚开始使用Riverpod和它的供应商.我有两个几乎相同的futureProvider,但其中一个不向UI返回数据,即使API返回数据.

以下是用户界面部件


class ProductDetailSimilarProductsWidget extends ConsumerWidget {
  const ProductDetailSimilarProductsWidget(this.product, {super.key});

  final ProductDetailModel product;

  @override
  Widget build(BuildContext context, WidgetRef ref) {
    var value = ref.watch(getSimilarProductsFutureProvider([product.Id, product.KategoriId]));
    return Container(
      height: MediaQuery.of(context).size.height * 0.5,
      width: MediaQuery.of(context).size.width,
      child: value.when(
        data: (data) {
          print("data length:${data.length}");
          return ListView.builder(
            itemCount: data.length,
            shrinkWrap: true,
            scrollDirection: Axis.horizontal,
            itemBuilder: (context, index) {
              return Padding(
                padding: EdgeInsets.only(left: AppTheme.mediumPadding, right: AppTheme.mediumPadding),
                child: ProductGridContainerWidget(product: data[index]),
              );
            },
          );
        },
        error: (err, trace) {
          return Text(err.toString());
        },
        loading: () => AppTheme.spinkit,
      ),
    );
  }
}

下面是future 提供程序对象


final getSimilarProductsFutureProvider = FutureProvider.family<List<Products>, List<dynamic>>((ref, value) async {
  var result = await ProductDetailData().getSimilarProducts(productId: value[0], categoryId: value[1]);
  print("result: ${result.length}");
  return result;
});

最后,该方法执行API调用

    var service = ApiService();
    var sharedPreferencesManager = SharedPreferencesManager();
    await sharedPreferencesManager.init();
    var langId = await sharedPreferencesManager.getLanguageId();
    var countryId = await sharedPreferencesManager.getCountryId();
    var result =
        await service.getRequest(subUrl: "${ApiRoutes.getSimilarProducts}?productId=$productId&langId=$langId&countryId=$countryId&categoryId=$categoryId");
    List<Products> products = [];
    var elements = json.decode(result.body);
    await Future.forEach(elements, (element) => products.add(Products.fromMap(element as Map<String, dynamic>)));
    return products;

在提供程序对象内部,Result.Length变量打印10,这是预期的.但在UI部件内部,widget stucks on loading partdoes not print data.length variable.

我的代码有什么问题吗?此外,API运行良好,并成功返回数据.

推荐答案

你的错误可能是用这份名单作为.family的参数.

理想情况下,参数应该是原语(bool/int/double/string)、常量(提供者)或覆盖==和hashCode的不可变对象.

try 使用Records或创建具有两个必填字段的不可变对象.

Flutter相关问答推荐

飘动的文本用/字符绕转

如何在flutter文本字段中添加要点条目?

我如何才能收到每天重复的预定通知?

文本未设置在集装箱摆动的中心

在Flutter 中创建自定义Snackbar类

CLI数据库连接后将SHA-1密钥添加到Firebase项目

在框中保存对象列表时,类型推断无法正常工作

就像Flutter 中的头文件一样?

如何删除使用isscllable时出现的左边距?

在背景图像上排列定位徽标

从Firestore流式传输单个文档还是整个集合更好?

Flutter类调用另一个类中的另一个方法失败

使用 flutter_svg 在 flutter 中的 Canvas 上绘制 SVG 图像

'type' Icon '不是类型' IconData '的子类型

文本溢出文本框 - Flutter

#Flutter/Riverpod - 使用 AsyncNotifier 时是否可以仅调用错误?

如何从 Flutter Slider Widget 中移除发光效果?

如何在 cupertino switch flutter 中添加文本

在 FAB 上添加表格小部件单击 FLUTTER

Textfield 和 MasonryGrid 给出错误(垂直视口的高度没有限制)