当前位置: 首页 > 知识库问答 >
问题:

flutter - Flutter图片浏览时删除图片怎样跳转下一张?

班浩皛
2024-05-04

新人正在学习Flutter,使用wechat_assets_picker上传多张图片,使用extended_image做图片浏览,浏览图片时,删除单张图片后extended_image怎样跳转到下一张图片?

post.dart页面代码:

import 'dart:io';import 'package:extended_image/extended_image.dart';import 'package:flutter/material.dart';import 'package:wechat_assets_picker/wechat_assets_picker.dart';class Post extends StatefulWidget {  const Post({super.key});  @override  State<Post> createState() => _PostState();}class _PostState extends State<Post> {  //  已选中图片列表  List<AssetEntity> selectedAssets = [];  // 相册图片初始化索引  int currentIndex = 0;  /// 从相册选取图片  pickImage(BuildContext context) async {    final List<AssetEntity>? result = await AssetPicker.pickAssets(      context,      pickerConfig: AssetPickerConfig(        maxAssets: 4,        requestType: RequestType.image,        textDelegate: const AssetPickerTextDelegate(),        selectedAssets: selectedAssets      ),    );    if (result != null) {      setState(() {        selectedAssets = result;      });    }  }  /// 上传的图片列表(小图预览)  Widget _imagesList() {    return LayoutBuilder(        builder: (BuildContext context, BoxConstraints constraints) {          final double width = (constraints.maxWidth - 5 * 3) / 4;          return Wrap(            spacing: 5,            children: [              for (final asset in selectedAssets)                InkWell(                  onTap: () {                    setState(() {                      currentIndex = selectedAssets.indexOf(asset);                    });                    Get.to(() => gallery()); // 单击单张缩略图进入预览组件                  },                  child: Container(                    clipBehavior: Clip.antiAlias,                    decoration: BoxDecoration(                        borderRadius: BorderRadius.circular(5)                    ),                    child: AssetEntityImage(                      asset,                      width: width,                      height: width,                      fit: BoxFit.cover,                      isOriginal: false, //是否原图,否                    ),                  ),                ),              if(selectedAssets.length < 4)                InkWell(                  onTap: () => pickImage(context),                  child: Container(                    width: width,                    height: width,                    decoration: BoxDecoration(                        color: const Color.fromRGBO(242, 242, 244, 1),                        borderRadius: BorderRadius.circular(5)                    ),                    child: const Icon(Fonts.tianjia, color: Color.fromRGBO(178, 178, 180, 1)),                  ),                )            ],          );        }    );  }  // 图片浏览  Widget gallery() {    return Scaffold(      extendBodyBehindAppBar: true,      appBar: AppBar(        title: Row(          crossAxisAlignment: CrossAxisAlignment.baseline,          textBaseline: TextBaseline.alphabetic,          mainAxisAlignment: MainAxisAlignment.spaceBetween,          children: [            InkWell(                onTap: () => Get.back(),                child: const Icon(Fonts.fanhui)            ),            // 删除按钮            InkWell(              onTap: () {                setState(() {                  selectedAssets.remove(selectedAssets[currentIndex]);                });                //当选中的图片被删除干净后,关掉图片查看器                if(selectedAssets.isEmpty) {                  Get.back();                }              },              child: const Icon(Fonts.shanchu, size: 20, color: Color.fromRGBO(50, 50, 52, 1)),            ),          ],        ),      ),      body: ExtendedImageGesturePageView.builder(          controller: ExtendedPageController(            // 传入图片初始位置            initialPage: currentIndex,          ),          onPageChanged: (int index) {            setState(() {              currentIndex = index;            });          },          itemCount: selectedAssets.length,          itemBuilder: (BuildContext context, int index) {            AssetEntity item = selectedAssets[index];            return ExtendedImage(              image: AssetEntityImageProvider(                  item,                  isOriginal: true              ),              fit: BoxFit.cover,              mode: ExtendedImageMode.gesture,              clearMemoryCacheWhenDispose: true,              initGestureConfigHandler: ((state) {                return GestureConfig(                    minScale: 0.9,                    maxScale: 3.0,                    animationMinScale: 0.7,                    animationMaxScale: 3.5,                    speed: 1.0,                    inertialSpeed: 100.0,                    initialScale: 1.0,                    inPageView: true                );              }),            );          }      ),    );  }  @override  Widget build(BuildContext context) {    return Scaffold(      body: Column(        crossAxisAlignment: CrossAxisAlignment.start,        children: _imagesList()      )    );  }}

目前能正常删除已选中的图片,但是在删除成功后,图片查看器没办法自动转到在一张图片。

共有1个答案

滕祯
2024-05-04
假如当前在第1页,执行setState((){selectedAssets.remove(selectedAssets[currentIndex]);  }); 后就会显示第2页的内容 ;代码应该没有问题的     
class Chome extends StatefulWidget {  const Chome({super.key});  @override  State<Chome> createState() => _ChomeState();}class _ChomeState extends State<Chome> {  var currentIndex = 0;  var selectedAssets = [    'A',    'B',    'C',  ];  PageController ctl = PageController(initialPage: 0);  @override  Widget build(BuildContext context) {    return Scaffold(      extendBodyBehindAppBar: true,      appBar: AppBar(        title: Row(          crossAxisAlignment: CrossAxisAlignment.baseline,          textBaseline: TextBaseline.alphabetic,          mainAxisAlignment: MainAxisAlignment.spaceBetween,          children: [            InkWell(onTap: () => () {}, child: const Icon(Icons.arrow_back)),            InkWell(              onTap: () {                setState(() {                  selectedAssets.remove(selectedAssets[currentIndex]);                });              },              child: const Icon(                Icons.delete,              ),            ),          ],        ),      ),      body: ExtendedImageGesturePageView.builder(          controller: ctl,          onPageChanged: (int index) {            setState(() {              currentIndex = index;            });          },          itemCount: selectedAssets.length,          itemBuilder: (BuildContext context, int index) {            return Center(              child: Container(                color: Colors.grey,                child: Text(                  'Page: ${selectedAssets[index]}',                  style: const TextStyle(color: Colors.red, fontSize: 40),                ),              ),            );          }),    );  }

看看这个例子是有改变的

 类似资料:
  • 从互联网下载图片,并显示。下载图片过程中显示进度条。支持图片缩放,运用了ASI、SDWebImage。支持图片缓存。 [Code4App.com]

  • 使用图片浏览器,你需要在 sm.js 和 sm.css 之后额外引入如下两个文件: <link rel="stylesheet" href="//g.alicdn.com/msui/sm/0.6.2/css/sm-extend.min.css"> <script type='text/javascript' src='//g.alicdn.com/msui/sm/0.6.2/js/sm-exte

  • 图片浏览器是一个像iOS图片浏览器一样用来展示图片的组件。图片可以被缩放或者平移 (可选)。 图片浏览器使用 幻灯片组件来展现图片。 创建一个图片浏览器实例 图片浏览器只需通过javaScript就可以被创建和初始化。我们需要使用App封装好的方法: myApp.photoBrowser(parameters) - 带参初始化图片浏览器 parameters - object - 图片浏览器参数对

  • 雪梦图片浏览器是一款界面简单,功能强大的 android 图片浏览器。 特性 双击放大/缩小图片 动态滑屏翻页 分享图片至邮件,蓝牙,环聊,QQ,微信,Google+等 将图片设置为壁纸或者联系人图标 支持动态播放Gif图片 支持显示SVG图片 支持格式:JPEG (.jpg);GIF (.gif);PNG (.png);BMP (.bmp);WebP (.webp) (Android 4.0+);SVG (.svg)

  • 本文向大家介绍怎样去除图片自带的边距?相关面试题,主要包含被问及怎样去除图片自带的边距?时的应答技巧和注意事项,需要的朋友参考一下 空隙产生的原因,换行符,空格符,制表符等你空白符,字体不为0的情况下,都会产生一个字符的空隙,空格符好会占据一定宽度,使用inline-block会产生元素间的空隙。 解决方法: 1.父元素设置:font-size=0 2.使用flexbox 不清楚图片去除自带边距的

  • 问题内容: 我目前正在使用Twitter Bootstrap开发一个响应式网站。 该网站在移动设备/平板电脑/桌面上具有全屏背景图片。这些图像使用两个div旋转并逐渐淡入。 除了一个问题,它几乎是完美的。使用iOS Safari,Android浏览器或Android上的Chrome,当用户向下滚动页面并导致地址栏隐藏时,背景会略微跳动。 在移动设备上访问它并向下滚动,您应该会看到图像调整大小/移动