#flutter #flutter-dependencies #dart-pub #flutter-getx
Вопрос:
Я пытаюсь загрузить список продуктов и использую CachedNetworkImage (или если я также использую Image.network) для отображения изображения этого конкретного продукта.
Я использовал свойство построителя ошибок, чтобы, если изображение выдает ошибку, показать изображение актива по умолчанию, и оно работает нормально. Пока я не нажму на другую страницу поверх нее, я получу следующее в консоли отладки.
I/flutter (21932): ══╡ EXCEPTION CAUGHT BY IMAGE RESOURCE SERVICE ╞════════════════════════════════════════════════════
I/flutter (21932): The following NetworkImageLoadException was thrown resolving an image codec:
I/flutter (21932): HTTP request failed, statusCode: 404, https://***.com/url.jpg
Однако я где-то читал, что если мы получаем такого рода ошибку, то просто игнорируем ее, поскольку автор CachedNetoworkImage также сказал то же самое в своей последней строке документа. Но дело в том, что я также использую Firebase Crashlytics для отображения сбоев и ошибок, если таковые имеются.
Дело в том, что из-за этого исключения я получаю несмертельные ошибки. Таким образом, даже если 1 пользователь просматривает мое приложение, они не увидят никакой ошибки на экране, но если я пройду через crashlytics, я получу более 48 несмертельных ошибок этого конкретного пользователя.
Это мой код для отображения списка товара и его изображения ProductTile.dart
import 'package:applicationName/views/product_page/model/ProductModel.dart';
import 'package:flutter/material.dart';
import 'package:cached_network_image/cached_network_image.dart';
import 'package:get/get.dart';
class ProductTile extends StatelessWidget {
final Product product;
const ProductTile(this.product);
@override
Widget build(BuildContext context) {
return InkWell(
onTap: () {
Get.toNamed("/productDetailPage/${product.prodId}");
},
child: Card(
elevation: 2,
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Row(
crossAxisAlignment: CrossAxisAlignment.center,
children: [
Container(
decoration: BoxDecoration(
borderRadius: BorderRadius.only(
bottomRight: Radius.circular(8.0)),
color: Colors.indigo,
),
padding: EdgeInsets.all(4.0),
child: Text(
"${product.discount}% OFF",
textScaleFactor: 0.8,
style: TextStyle(
color: Colors.white,
),
maxLines: 2,
overflow: TextOverflow.ellipsis,
),
),
SizedBox(width: 10),
],
),
Container(
// color: Colors.red,
child: Image.network(
product.image,
errorBuilder: (BuildContext context, Object exception,
StackTrace stackTrace) {
// Appropriate logging or analytics, e.g.
// myAnalytics.recordError(
// 'An error occurred loading "https://example.does.not.exist/image.jpg"',
// exception,
// stackTrace,
// );
return Image.asset('assets/images/noimage.png');
},
)
//I commented this to check if same is happening with Image.network() also or not and it's happening in //it too.
// CachedNetworkImage(
// alignment: Alignment.center,
// imageUrl: product.image,
// placeholder: (context, url) =>
// Center(child: CircularProgressIndicator()),
// errorWidget: (context, url, error) =>
// Image.asset('assets/images/noimage.png'),
// ),
),
SizedBox(height: 8),
Padding(
padding: const EdgeInsets.only(left: 8.0),
child: Text(
product.prodName,
maxLines: 2,
style: TextStyle(
fontFamily: 'avenir', fontWeight: FontWeight.w800),
overflow: TextOverflow.ellipsis,
),
),
SizedBox(height: 8),
Padding(
padding: const EdgeInsets.only(left: 8.0),
child: Flex(
direction: Axis.vertical,
children: [
Text(
// "Some Text",
// '₹${double.parse(product.fprice).toStringAsFixed(2)}',
double.tryParse(product.priceFormat) is double
? "₹${double.tryParse(product.priceFormat).toStringAsFixed(2)}"
: "${product.priceFormat}",
style: TextStyle(
// fontSize: 20,
fontFamily: 'avenir',
decoration: TextDecoration.lineThrough),
),
],
),
),
SizedBox(height: 8),
Padding(
padding: const EdgeInsets.only(left: 8.0, bottom: 8.0),
child: Flex(
direction: Axis.vertical,
children: [
Text(
// "Some Text",
//
// product.price is String
// ? '₹${double.parse(product.price).toStringAsFixed(2)}'
// : '₹${product.price.toStringAsFixed(2)}',
double.tryParse(product.fpriceFormat) is double
? "₹${double.tryParse(product.fpriceFormat).toStringAsFixed(2)}"
: "${product.fpriceFormat}",
style: TextStyle(
// fontSize: 15,
fontFamily: 'avenir',
),
),
],
),
),
],
),
),
);
}
}
Независимо от того, какую страницу я нажимаю после указанной выше страницы, я все равно получаю это исключение в консоли.
Комментарии:
1. является ли uri недействительным?
2. @JohnJoe да, uri неверен, и это очевидно, потому что изображения загружаются не для всех продуктов, для некоторых продуктов есть только некоторые изображения, поэтому я использовал конструктор ошибок, чтобы, если изображение не найдено, использовать изображение ресурса.