我是第一次使用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工作正常,并成功返回数据。
1条答案
按热度按时间izj3ouym1#
您的错误可能是使用列表作为
.family
的参数。理想情况下,参数应该是一个原语(bool/int/double/String)、一个常量(providers)或一个覆盖==和hashCode的不可变对象。
尝试使用Records或创建一个具有两个必需字段的不可变对象。