我有一张包含卡片的列表视图,其中包含从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图像有关。缓存被锁定了吗?
答案 0 :(得分:2)
我将代码更改为以下内容:
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:错误
但是最主要的是浏览所有图像: