【发布时间】:2018-09-06 21:00:17
【问题描述】:
这个问题的目的是找到从图库中显示大量图像(20 或更多)的最佳方式。 我需要在设备上显示所有照片。如您所见,可能会显示很多图像,当我尝试使用不同的 Image.file() 小部件显示它们时,我的手机(LG G2)变慢,然后应用程序完全崩溃。
我认为问题在于我在 5 年的旧设备上加载了大量 4K 图像(超过 100 张)。实际上同时显示在屏幕上的图像实际上在 15 个左右,但我需要有类似画廊的东西,所以所有图像都在 GridView 中。
所以,我认为这不是最好的选择,也许有一个功能可以将图像缩小到 100x100 像素。但是上网查了一下,什么都没有。那么,有没有更好的办法呢?
我使用 Android 平台通道获取所有图像路径及其文件夹。
我将它们全部放在这样的列表中: [[“相机”、“存储/仿真/0/downloads/1.png”]等]
屏幕上有三个主要组件,带有两个箭头的图标按钮: DropDownMenu 和 GridView。
IconButton 请求来自 android 的所有路径。在上述列表中。 DropDown 菜单在 onChanged 上有一个函数,它在 gridView 使用的 List 中创建所有卡片。
这是功能:
void _onChanged(String value) {
setState(() {
_currFolder = value;
_photoCards = calculatePhotoCards();
});
}
calculatePhotoCards 是这样的:
List<Widget> calculatePhotoCards() {
List<Widget> list = new List();
for (int v = 0; v < _foldersAndPaths.length; v++) {
if (_foldersAndPaths[v][0] == _currFolder) {
list.add(Card(
color: Colors.white,
shape: RoundedRectangleBorder(
borderRadius: BorderRadius.all(Radius.circular(20.0))),
child: Padding(
padding: const EdgeInsets.all(8.0),
child: new ClipRRect(
borderRadius: new BorderRadius.circular(8.0),
child: Image.file(
File(_foldersAndPaths[v][1]),
fit: BoxFit.cover,
),
),
),
));
}
}
print(list);
return list;
}
其中 _foldersAndPaths 是包含其各自文件夹的所有路径的列表(如上所述),而 _currFolder 是 DropDownMenu 中的选定文件夹。
【问题讨论】:
-
请包含您用来尝试加载和显示图像的代码。即使是旧手机,加载 20 张图片也不应该崩溃,所以很有可能发生了其他事情。
-
而且仅供参考 - 默认情况下,flutter 确实会缩小图像大小和缓存,因此您不必担心太多。
-
在我的 LG G2 上,正如我所说,我正在加载 100 多张,实际上将近 50 万张照片。我正在将代码添加到描述中
-
对,但它不应该一次加载所有 100/500,而是加载当前屏幕上的那些。如果您尝试一次将所有 500 个都加载到内存中,那么您显然会遇到问题
-
看看this answer(尽管忽略问题的代码 - 它不是最好的),以了解可能是什么问题......