ana*_*shi 9 listview memory-leaks image flutter
我正在垂直显示来自互联网的图像ListView。我使用http.get(不使用缓存的网络图像,因为我不想缓存图像)获取图像。然后我将图像插入Uint8List到image.memory(). 发生的情况是,当用户滚动列表并且加载图像时,内存不断增加,直到整个应用程序崩溃。有什么想法要做什么吗?
小智 10
是的,这是正常行为。我不知道到底为什么。我的理论是,如果持有对它们的引用的 dart 对象被垃圾收集,则默认情况下图像会被处理,而不是当小部件从小部件树中删除时,但不要相信我的话 - 这只是我个人的推理。这可能是完全错误的。
为了解决这个问题,我使用Extended Image pakcage它的构造函数采用 boolclearMemoryCacheWhenDispose来处理滚动列表中 RAM 中的图像。您可以这样做或访问包代码以了解他是如何做到的,然后复制它。
我可以给出的其他建议是确保您的图像尺寸合适。如果您在本地加载图像,请检查文档的这一部分,以便为不同的屏幕尺寸选择不同的尺寸https://flutter.dev/docs/development/ui/assets-and-images#loading-images
如果您更有可能从网络获取图像,请确保它们的尺寸合适,并且如果可以的话,提供不同的尺寸。如果您无法控制该设置cacheWidth,则会减少内存 (RAM)cacheHeight中Image.memory的缓存图像。默认情况下,您会看到 Flutter 会以全分辨率缓存图像,尽管它们在设备/应用程序中的外观大小相同。例如,如果您希望图像显示在 200x200 框中,则设置cacheWidth为您将在 中200 * window.devicePixelRatio.ceil()找到,如果您仅设置,则图像的比例将保持不变。如果您仅设置,则同样如此。也请按照建议使用。windowdart:uicacheWidthcacheHeightListView.builder
我对 Flutter 文档中对此的提及如此之少感到失望。大多数时候,人们在应用程序开始崩溃时就会发现这个问题。请定期检查您的开发工具的内存消耗情况。这是最好的指标。
干杯,祝你好运