flutter FutureProvider不向UI返回数据

7dl7o3gd  于 2023-06-07  发布在  Flutter
关注(0)|答案(1)|浏览(152)

我是第一次使用Riverpod及其提供商。我有2个几乎相同的futureProviders,但其中一个不返回数据到UI,即使API返回数据。
这里是UI部分

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,
      ),
    );
  }
}

下面是futureProvider对象

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;

在provider对象内部,result.length变量打印10,这是预期的。但在UI部件内部,widget卡在加载部件上不打印数据。长度变量
我的密码有问题吗?API工作正常,并成功返回数据。

izj3ouym

izj3ouym1#

您的错误可能是使用列表作为.family的参数。
理想情况下,参数应该是一个原语(bool/int/double/String)、一个常量(providers)或一个覆盖==和hashCode的不可变对象。
尝试使用Records或创建一个具有两个必需字段的不可变对象。

相关问题