image - Flutter:来自网络的 ImageCache 使应用程序崩溃 - 警告数据库已被锁定为 0:00:10.000000。确保您始终使用
问题描述
我有一个包含从 CDN 加载的图像的卡片列表视图。当滚动到页面的 50%(分页)时,我得到 20 个新产品。但是,一段时间后它总是崩溃。
会不会是大图的原因?部分图片还未上传,返回404。图片有时也会闪烁,重新加载。
使用 Flutter 推荐的以下软件包:https ://github.com/renefloor/flutter_cached_network_image
代码:
Container(
padding: EdgeInsets.only(
top: MediaQuery.of(context).size.height * 0.02),
width: MediaQuery.of(context).size.width * 0.3,
child: CachedNetworkImage(
placeholder: (context, url) => Container(
padding: EdgeInsets.only(
top: MediaQuery.of(context).size.height *
0.05),
child: placeholder,
),
imageUrl: widget.product.pictureUrl,
)
堆栈跟踪:
MultiFrameImageStreamCompleter._decodeNextFrameAndSchedule (image_stream.dart:680)
MultiFrameImageStreamCompleter._handleCodecReady (image_stream.dart:644)
FileImage._loadAsync (image_provider.dart)
FileImage.load (image_provider.dart:638)
ImageProvider.resolve.<fn>.<fn>.<fn> (image_provider.dart:327)
ImageCache.putIfAbsent (image_cache.dart:160)
ImageProvider.resolve.<fn>.<fn> (image_provider.dart:325)
SynchronousFuture.then (synchronous_future.dart:38)
ImageProvider.resolve.<fn> (image_provider.dart:323)
ImageProvider.resolve (image_provider.dart:315)
_ImageState._resolveImage (image.dart:1010)
_ImageState.didChangeDependencies (image.dart:967)
StatefulElement._firstBuild (framework.dart:4376)
ComponentElement.mount (framework.dart:4201)
Element.inflateWidget (framework.dart:3194)
Element.updateChild (framework.dart:2988)
SingleChildRenderObjectElement.mount (framework.dart:5445)
Element.inflateWidget (framework.dart:3194)
MultiChildRenderObjectElement.mount (framework.dart:5551)
Element.inflateWidget (framework.dart:3194)
编辑1:
经过一番调查,我发现如果我在任何地方都使用相同的图片(可以是高分辨率的)它可以正常工作。那么,要么是一些可能损坏的图片,要么是很难处理许多不同的图片?
Edit2: 崩溃时发生的输出之一如下:
I/flutter (5858):警告数据库已锁定 0:00:10.000000。确保在事务期间始终使用事务对象进行数据库操作
也感觉和404图像越来越相关。缓存是否被锁定?
解决方案
我将代码更改为以下内容:
FadeInImage(
placeholder: MemoryImage(kTransparentImage),
image: new CachedNetworkImageProvider(
widget.product.pictureUrl),
))
我还更改了显示所有图片的列表:
SliverGridDelegateWithFixedCrossAxisCount(
childAspectRatio: _aspectRatio, crossAxisCount: 2),
itemCount: widget.products.length,
addAutomaticKeepAlives: false,
itemBuilder: (context, index) {
return ProductCard(
showProductFunction: showProductFunction,
product: widget.products[index]);
},
可能产生一些影响的财产:
addAutomaticKeepAlives:假
但最重要的是浏览所有图像:
- 所有图像都存在(无 404)
- 所有图像最大为 500x500(之前为 4000x4000)
- 现在所有图像都已压缩
推荐阅读
- youtube-api - Youtube API inStream 参数为空
- javascript - 如果所有项目具有相同的 Id,如何使用单击事件删除单击的项目
- visual-studio-code - VS Code:当我关闭子文件夹并返回文件时,子文件夹会重新打开
- html - 单选按钮不会出现在网站上
- python - 我想向列表中添加一个值并用它做一些事情
- bash - bash 中的简单 'printf' 搞砸了输出
- html - Flexbox: 反向包装/“蛇形包装”
- python - 考虑三个数字,nr_1、nr_2 和 nr_3。如何编写一个程序,使 nr_1 具有最大值而 nr_3 最小
- android - AOSP 添加预建 APK - 错误未知目标
- javascript - 无法通过 javascript 在 php 服务器上获取数据;