Flutter 抖动缩小图像大小以将其用于ListView或GridView

Flutter 抖动缩小图像大小以将其用于ListView或GridView,flutter,Flutter,由于从手机存储中读取图像会返回全分辨率图像,而Flatter不会根据渲染的大小自动缩小图像,并且在将图像显示到ListView或GridView中后,我们会获得lake内存,因此如何解决此问题 class StorageMediaBloc { BehaviorSubject<List<StorageMediaList>> _storageMedia$; BehaviorSubject<List<MediaModel>> _imagesMed

由于从手机存储中读取图像会返回全分辨率图像,而Flatter不会根据渲染的大小自动缩小图像,并且在将图像显示到
ListView
GridView
中后,我们会获得lake内存,因此如何解决此问题

class StorageMediaBloc {
  BehaviorSubject<List<StorageMediaList>> _storageMedia$;
  BehaviorSubject<List<MediaModel>> _imagesMedia$;
  BehaviorSubject<List<MediaModel>> _videosMedia$;

  BehaviorSubject<List<MediaModel>> get imagesMedia$ => _imagesMedia$;
  BehaviorSubject<List<MediaModel>> get videosMedia$ => _videosMedia$;

  StorageMediaBloc() {
    _initStreams();
    _initObservers();
  }

  Future<void> fetchVideos()async {
    try {
      final String videos = await StoragePath.videoPath;
      _videosMedia$.add((jsonDecode(videos) as List).map<MediaModel>((json) => MediaModel.fromJson(json as Map<String,dynamic>)).toList());
    } on PlatformException {
      _videosMedia$.add([]);
    }
  }
  Future<void> fetchImages() async {
    try {
      final String images = await StoragePath.imagesPath;
      _imagesMedia$.add((jsonDecode(images) as List).map<MediaModel>((json) => MediaModel.fromJson(json as Map<String,dynamic>)).toList());
    } on PlatformException {
      _imagesMedia$.add([]);
    }
  }

  void _initStreams() {
    _storageMedia$ = BehaviorSubject<List<StorageMediaList>>();
    _imagesMedia$ = BehaviorSubject<List<MediaModel>>();
    _videosMedia$ = BehaviorSubject<List<MediaModel>>();
  }

  void _initObservers() {
    _videosMedia$.listen((List<MediaModel> mediaList) {
    });
    _imagesMedia$.listen((List<MediaModel> mediaList) {
    });
  }

  void dispose() {
    _storageMedia$.close();
  }
}
class StorageMediaBloc{
行为主体_storageMedia$;
行为主体_imagesMedia$;
行为主体_videosMedia$;
行为主体获取imagesMedia$=>\u imagesMedia$;
行为主体获取视频媒体$=>\u视频媒体$;
StorageMediaBloc(){
_initStreams();
_initobsers();
}
Future fetchVideos()异步{
试一试{
最终字符串videos=wait StoragePath.videoPath;
_videosMedia$.add((jsonDecode(视频)作为列表).map((json)=>MediaModel.fromJson(json作为映射)).toList();
}平台异常{
_videosMedia$.add([]);
}
}
Future fetchImages()异步{
试一试{
最终字符串图像=wait StoragePath.imagesPath;
_imagesMedia$.add((jsonDecode(images)作为列表).map((json)=>MediaModel.fromJson(json作为映射)).toList();
}平台异常{
_imagesMedia$.add([]);
}
}
void _initStreams(){
_storageMedia$=BehaviorSubject();
_imagesMedia$=行为主体();
_videosMedia$=行为主体();
}
void(){
_videosMedia$.listen((列表媒体列表){
});
_imagesMedia$.listen((列表媒体列表){
});
}
无效处置(){
_storageMedia$.close();
}
}
创建并显示图像

StreamBuilder<List<MediaModel>>(
    stream: _globalBloc.storageMediaBloc.imagesMedia$,
    builder: (context, snapshot) {
      if (!snapshot.hasData) {
        return const Center(
          child: CircularProgressIndicator( ),
        );
      }
      final List<MediaModel> _allImages = snapshot.data;
      changeValueNotifierValue(_allImages);

      final List<File> _imagesFiles = _allImages[0].files.map((e) => File('$e')).toList();
      return Column(
        children: <Widget>[
          Container(
            width: 50.0,
            height: 5.0,
            decoration: BoxDecoration(
              borderRadius: BorderRadius.circular(15.0),
              color: Colors.black
            ),
          ),
          Expanded(
            child: ClipRRect(
              clipBehavior: Clip.antiAliasWithSaveLayer,
              borderRadius: BorderRadius.circular(20.0),
              child: DragSelectGridView(
                gridController: controller,
                scrollController: scrollController,
                padding: const EdgeInsets.all(8),
                cacheExtent: 1500,
                itemCount: _imagesFiles.length,
                itemBuilder: (context, index, selected) {
                  return AspectRatio(
                           aspectRatio: 1,
                           child: Image.file(_media,fit: BoxFit.cover,))
                },
                gridDelegate: const SliverGridDelegateWithFixedCrossAxisCount(
                  crossAxisCount: 3,
                  mainAxisSpacing: 5.0,
                  crossAxisSpacing: 5.0,
                ),
              ),
            ),
          ),
        ],
      );
    }
),
StreamBuilder(
流:_globalBloc.storageMediaBloc.imagesMedia$,
生成器:(上下文,快照){
如果(!snapshot.hasData){
返回常数中心(
child:CircularProgressIndicator(),
);
}
最终列表_allImages=snapshot.data;
changeValueNotifierValue(_allImages);
最终列表_imagesFiles=_allImages[0].files.map((e)=>File(“$e”).toList();
返回列(
儿童:[
容器(
宽度:50.0,
身高:5.0,
装饰:盒子装饰(
边界半径:边界半径。圆形(15.0),
颜色:颜色。黑色
),
),
扩大(
孩子:ClipRRect(
clipBehavior:Clip.antiAliasWithSaveLayer,
边界半径:边界半径。圆形(20.0),
子项:DragSelectGridView(
网格控制器:控制器,
scrollController:scrollController,
填充:常量边集。全部(8),
范围:1500,
itemCount:_imagesFiles.length,
itemBuilder:(上下文、索引、选定项){
返回AspectRatio(
方面:1,
子:Image.file(_介质,fit:BoxFit.cover,)
},
gridDelegate:const SliverGridDelegateWithFixedCrossAxisCount(
交叉轴计数:3,
主轴间距:5.0,
交叉轴间距:5.0,
),
),
),
),
],
);
}
),
您可以使用插件根据容器大小减小图像大小。 首先使用
ImageProperties

ImageProperties-properties=wait-flatternativeimage.getImageProperties(file.path);
然后将复制的图像压缩到任何私人文件夹中,并使用它,如果需要,稍后将其删除

File compressedFile=wait flatternativeimage.compressImage(File.path,质量:80,
目标宽度:600,目标宽度:300);
您可以使用插件根据容器大小减小图像大小。 首先使用
ImageProperties

ImageProperties-properties=wait-flatternativeimage.getImageProperties(file.path);
然后将复制的图像压缩到任何私人文件夹中,并使用它,如果需要,稍后将其删除

File compressedFile=wait flatternativeimage.compressImage(File.path,质量:80,
目标宽度:600,目标宽度:300);