我刚开始使用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 part和does not print data.length variable.
我的代码有什么问题吗?此外,API运行良好,并成功返回数据.