flutter 多次上传照片组件

import 'package:cached_network_image/cached_network_image.dart';
import 'package:flutter/material.dart';
import 'package:image_picker/image_picker.dart';
import 'package:yl_etf/api/api_services.dart';
import 'package:yl_etf/common/services_locator.dart';
import 'package:yl_etf/generated/assets.dart';
import 'package:yl_etf/utils/util.dart';
import 'package:yl_etf/widgets/public_dropdown.dart';

class Camera extends StatefulWidget {
  const Camera({Key? key, required this.callBack}) : super(key: key);
  final Function callBack;
  @override
  State<Camera> createState() => _CameraState();
}

class _CameraState extends State<Camera> {
  ApiServices services = serviceLocator<ApiServices>();

  List data = [
    {'label': '相机', 'value': '相机'},
    {'label': '相册', 'value': '相册'},
  ];

  List submitData = [Assets.dafultImage];

  ///上传图片
  void uploadPaymentDocument(String filePath) async {
    BLDUtil.showLoading(status: '正在上传图片');
    final res = await services.uploadImage(filePath: filePath);
    if (res.isSuccess) {
      BLDUtil.toast('上传成功');
      submitData.insert(0, res.data.toString());
      widget.callBack(submitData);
      setState(() {});
    } else {
      BLDUtil.toast('上传失败');
    }
  }

  /*拍照*/
  _takePhoto() async {
    final ImagePicker _picker = ImagePicker();
    final XFile? image = await _picker.pickImage(source: ImageSource.camera);
    if (image != null) {
      uploadPaymentDocument(image.path);
    }
  }

  /*相册*/
  _openGallery() async {
    final ImagePicker _picker = ImagePicker();
    final XFile? image = await _picker.pickImage(source: ImageSource.gallery);
    if (image != null) {
      uploadPaymentDocument(image.path);
    }
  }

  _delectImageData(e) {
    setState(() {
      submitData.removeAt(e);
    });
    widget.callBack(submitData);
  }

  @override
  Widget build(BuildContext context) {
    return Container(
      padding: const EdgeInsets.all(10),
      child: Column(
        crossAxisAlignment: CrossAxisAlignment.start,
        children: [
          submitData.isEmpty
              ? Container()
              : Wrap(
                  crossAxisAlignment: WrapCrossAlignment.center,
                  runSpacing: 3.0,
                  children: submitData
                      .asMap()
                      .keys
                      .map((e) => submitData[e] == Assets.dafultImage
                          ? GestureDetector(
                              onTap: () {
                                publicDropdownFunction(context,
                                    callback: (value, select) {
                                  if (value['value'] == '相机') {
                                    _takePhoto();
                                  } else {
                                    _openGallery();
                                  }
                                }, defaultIndex: 0, data: data, title: '请选择方式');
                              },
                              child: Container(
                                alignment: Alignment.center,
                                width: 100,
                                height: 100,
                                margin: const EdgeInsets.only(top: 20),
                                decoration: const BoxDecoration(
                                    color: Color(0xfff7f7f7),
                                    borderRadius:
                                        BorderRadius.all(Radius.circular(10))),
                                child: Image.asset(Assets.dafultImage),
                              ),
                            )
                          : Stack(
                              children: [
                                Container(
                                  margin:
                                      const EdgeInsets.only(right: 20, top: 10),
                                  color:
                                      const Color(0xffCCCCCC).withOpacity(.2),
                                  child: CachedNetworkImage(
                                    width: 100,
                                    height: 100,
                                    imageUrl: submitData[e],
                                    imageBuilder: (context, imageProvider) =>
                                        Container(
                                      decoration: BoxDecoration(
                                        image: DecorationImage(
                                            image: imageProvider,
                                            fit: BoxFit.cover),
                                      ),
                                    ),
                                    errorWidget: (context, url, error) =>
                                        const Icon(Icons.error),
                                  ),
                                ),
                                Positioned(
                                    right: 10,
                                    child: GestureDetector(
                                      onTap: () {
                                        _delectImageData(e);
                                      },
                                      child: const Icon(
                                        Icons.cancel,
                                        color: Colors.red,
                                      ),
                                    ))
                              ],
                            ))
                      .toList(),
                ),
        ],
      ),
    );
  }
}

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值