ИСКЛЮЧЕНИЕ, ОБНАРУЖЕННОЕ СЛУЖБОЙ РЕСУРСОВ ИЗОБРАЖЕНИЙ — неустранимая ошибка Crashlytics — сбой http-запроса

#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 несмертельных ошибок этого конкретного пользователя. Неустранимая ошибка для изображений не найдена Ошибка 404

Это мой код для отображения списка товара и его изображения 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 неверен, и это очевидно, потому что изображения загружаются не для всех продуктов, для некоторых продуктов есть только некоторые изображения, поэтому я использовал конструктор ошибок, чтобы, если изображение не найдено, использовать изображение ресурса.