LinearGradient shimmerGradient = LinearGradient(
colors: [
Color(0xFFEBEBF4),
Color(0xFFF4F4F4),
Color(0xFFEBEBF4),
],
stops: [
0.1,
0.3,
0.4,
],
begin: Alignment(-1.0, -0.3),
end: Alignment(1.0, 0.3),
tileMode: TileMode.clamp,
);
return CachedNetworkImage(
imageUrl: widget.imageUrl,
placeholder: (context, url) {
return ShimmerLoading(
isLoading: true,
child: Container(
decoration: const BoxDecoration(
color: Colors.white,
),
));
},
);
if (!widget.isLoading) {
return widget.child;
}
// Вот здесь выскакивает ошибка.
final offsetWithinShimmer = shimmer.getDescendantOffset(
descendant: context.findRenderObject() as RenderBox,
);
Для того, чтобы все заработало, нужно добавить проверку на наличие виджета и renderObject в контексте:
if (!widget.isLoading
|| context.findRenderObject() == null
|| Shimmer.of(context) == null) {
return widget.child;
}
И тогда все начинает работать поскольку в случае если renderObject не находится, то просто возвращается дочерний виджет. Проблема в cached_network_image заключается в том, что в момент, когда изображение загружается, то когда происходит замена с placeholder на изображение, которое нужно загрузить, пропадает на секунду этот самый RenderObject и это вызывает ошибку. Тем не менее с помощью этого небольшого исправления все начинает работать.