|
|
|
import 'dart:convert';
|
|
|
|
|
|
|
|
import 'dart:io';
|
|
|
|
import 'dart:async';
|
|
|
|
|
|
...
|
...
|
@@ -10,6 +11,7 @@ import 'package:one_key/pages/online_check/photo_view_wiget.dart'; |
|
|
|
import 'package:one_key/pages/online_check/progress.dart';
|
|
|
|
|
|
|
|
import 'package:one_key/provider/online_check_edit_provider.dart';
|
|
|
|
import 'package:one_key/provider/upload_img_provider.dart';
|
|
|
|
import 'package:one_key/res/colors.dart';
|
|
|
|
import 'package:one_key/utils/dialog_util.dart';
|
|
|
|
import 'package:one_key/utils/misc.dart';
|
|
...
|
...
|
@@ -25,7 +27,6 @@ import 'package:qiniu_flutter_sdk/qiniu_flutter_sdk.dart'; |
|
|
|
import './dispose.dart';
|
|
|
|
import 'package:photo_manager/photo_manager.dart';
|
|
|
|
|
|
|
|
final int MAX_IMAGE_NUMBER = 5;
|
|
|
|
typedef void OnPickImageCallback(
|
|
|
|
double maxWidth, double maxHeight, int quality);
|
|
|
|
|
|
...
|
...
|
@@ -33,11 +34,13 @@ class ImgPickerWidget extends StatefulWidget { |
|
|
|
final ScrollController scrollController;
|
|
|
|
final Color borderColor;
|
|
|
|
final ValueChanged onChange;
|
|
|
|
final int maxImageNumber;
|
|
|
|
ImgPickerWidget(
|
|
|
|
{Key key,
|
|
|
|
this.scrollController,
|
|
|
|
this.borderColor = Colors.blue,
|
|
|
|
this.onChange})
|
|
|
|
this.onChange,
|
|
|
|
this.maxImageNumber = 5})
|
|
|
|
: super(key: key);
|
|
|
|
|
|
|
|
@override
|
|
...
|
...
|
@@ -46,7 +49,8 @@ class ImgPickerWidget extends StatefulWidget { |
|
|
|
|
|
|
|
class _ImgPickerWidgetState extends DisposableState<ImgPickerWidget> {
|
|
|
|
final picker = ImagePicker();
|
|
|
|
OnlineCheckEditProvider _onlineCheckEditProvider;
|
|
|
|
// OnlineCheckEditProvider _onlineCheckEditProvider;
|
|
|
|
UploadImageProvider _uploadImageProvider;
|
|
|
|
|
|
|
|
// 用户输入的文件名
|
|
|
|
String key;
|
|
...
|
...
|
@@ -81,14 +85,14 @@ class _ImgPickerWidgetState extends DisposableState<ImgPickerWidget> { |
|
|
|
UploadImgModel imgModel = UploadImgModel();
|
|
|
|
imgModel.file = File(pickedFile.path);
|
|
|
|
imgModel.process = 0.01;
|
|
|
|
_onlineCheckEditProvider.imageList.add(imgModel);
|
|
|
|
_uploadImageProvider.imageList.add(imgModel);
|
|
|
|
} else {
|
|
|
|
print('No image selected.');
|
|
|
|
}
|
|
|
|
});
|
|
|
|
if (pickedFile != null) {
|
|
|
|
startUpload(File(pickedFile.path),
|
|
|
|
_onlineCheckEditProvider.imageList.length - 1, true);
|
|
|
|
_uploadImageProvider.imageList.length - 1, true);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
...
|
...
|
@@ -112,7 +116,8 @@ class _ImgPickerWidgetState extends DisposableState<ImgPickerWidget> { |
|
|
|
// the check box disable color
|
|
|
|
itemRadio: 0.88,
|
|
|
|
// the content item radio
|
|
|
|
maxSelected: MAX_IMAGE_NUMBER - _onlineCheckEditProvider.imageList.length,
|
|
|
|
maxSelected:
|
|
|
|
widget.maxImageNumber - _uploadImageProvider.imageList.length,
|
|
|
|
// max picker image count
|
|
|
|
// provider: I18nProvider.english,
|
|
|
|
provider: I18nProvider.chinese,
|
|
...
|
...
|
@@ -146,10 +151,10 @@ class _ImgPickerWidgetState extends DisposableState<ImgPickerWidget> { |
|
|
|
UploadImgModel imgModel = UploadImgModel();
|
|
|
|
imgModel.file = File(file.absolute.path);
|
|
|
|
imgModel.process = 0.01;
|
|
|
|
_onlineCheckEditProvider.imageList.add(imgModel);
|
|
|
|
_uploadImageProvider.imageList.add(imgModel);
|
|
|
|
});
|
|
|
|
startUpload(File(file.absolute.path),
|
|
|
|
_onlineCheckEditProvider.imageList.length - 1, false);
|
|
|
|
_uploadImageProvider.imageList.length - 1, false);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
...
|
...
|
@@ -166,8 +171,8 @@ class _ImgPickerWidgetState extends DisposableState<ImgPickerWidget> { |
|
|
|
// 添加整体进度监听
|
|
|
|
putController.addProgressListener((percent) {
|
|
|
|
print('${index}任务进度变化:进度:${percent.toStringAsFixed(4)}');
|
|
|
|
_onlineCheckEditProvider.imageList[index].process = percent;
|
|
|
|
_onlineCheckEditProvider.notifyListeners();
|
|
|
|
_uploadImageProvider.imageList[index].process = percent;
|
|
|
|
_uploadImageProvider.notifyListeners();
|
|
|
|
});
|
|
|
|
// 添加实际发送进度订阅
|
|
|
|
putController.addSendProgressListener((percent) {
|
|
...
|
...
|
@@ -176,9 +181,9 @@ class _ImgPickerWidgetState extends DisposableState<ImgPickerWidget> { |
|
|
|
print('${index}实际发送变化:进度:${percent.toStringAsFixed(4)}');
|
|
|
|
});
|
|
|
|
if (token == null || token == '') {
|
|
|
|
await _onlineCheckEditProvider.getQiniuInfo(context, {});
|
|
|
|
await _uploadImageProvider.getQiniuInfo(context, {});
|
|
|
|
}
|
|
|
|
var usedToken = _onlineCheckEditProvider.qiniuInfoSunModel.token;
|
|
|
|
var usedToken = _uploadImageProvider.qiniuInfoSunModel.token;
|
|
|
|
if (usedToken == null || usedToken == '') {
|
|
|
|
print('token 不能为空');
|
|
|
|
return;
|
|
...
|
...
|
@@ -196,15 +201,15 @@ class _ImgPickerWidgetState extends DisposableState<ImgPickerWidget> { |
|
|
|
..then((PutResponse response) {
|
|
|
|
print('${index}上传已完成: 原始响应数据: ${jsonEncode(response.rawData)}');
|
|
|
|
print('------------------------');
|
|
|
|
String imgUrl = _onlineCheckEditProvider.qiniuInfoSunModel.domain +
|
|
|
|
String imgUrl = _uploadImageProvider.qiniuInfoSunModel.domain +
|
|
|
|
'/' +
|
|
|
|
response.rawData['key'];
|
|
|
|
_onlineCheckEditProvider.imageList[index].process = 1;
|
|
|
|
_onlineCheckEditProvider.imageList[index].qiniuUrl = imgUrl;
|
|
|
|
_uploadImageProvider.imageList[index].process = 1;
|
|
|
|
_uploadImageProvider.imageList[index].qiniuUrl = imgUrl;
|
|
|
|
// 取消当前任务
|
|
|
|
putController.cancel();
|
|
|
|
// _image
|
|
|
|
_onlineCheckEditProvider.notifyListeners();
|
|
|
|
_uploadImageProvider.notifyListeners();
|
|
|
|
})
|
|
|
|
..catchError((dynamic error) {
|
|
|
|
if (error is StorageError) {
|
|
...
|
...
|
@@ -405,59 +410,20 @@ class _ImgPickerWidgetState extends DisposableState<ImgPickerWidget> { |
|
|
|
|
|
|
|
@override
|
|
|
|
Widget build(BuildContext context) {
|
|
|
|
_onlineCheckEditProvider =
|
|
|
|
Provider.of<OnlineCheckEditProvider>(context, listen: true);
|
|
|
|
return Container(
|
|
|
|
width: double.infinity,
|
|
|
|
decoration: BoxDecoration(
|
|
|
|
color: Colors.white, borderRadius: BorderRadius.circular(10)),
|
|
|
|
child: Column(
|
|
|
|
crossAxisAlignment: CrossAxisAlignment.start,
|
|
|
|
children: <Widget>[
|
|
|
|
Container(
|
|
|
|
height: ScreenUtil().setWidth(53 * 2),
|
|
|
|
width: double.infinity,
|
|
|
|
decoration: BoxDecoration(
|
|
|
|
color: MyColours.color_FAFAFA,
|
|
|
|
borderRadius: BorderRadius.only(
|
|
|
|
topLeft: Radius.circular(10),
|
|
|
|
topRight: Radius.circular(10)),
|
|
|
|
),
|
|
|
|
child: Padding(
|
|
|
|
padding: EdgeInsets.fromLTRB(
|
|
|
|
ScreenUtil().setWidth(20),
|
|
|
|
ScreenUtil().setWidth(36),
|
|
|
|
ScreenUtil().setWidth(20),
|
|
|
|
ScreenUtil().setWidth(26)),
|
|
|
|
child: Text(
|
|
|
|
'消费清单(选填)',
|
|
|
|
style: TextStyle(
|
|
|
|
fontSize: ScreenUtil().setSp(32),
|
|
|
|
color: MyColours.color_353535,
|
|
|
|
fontWeight: FontWeight.bold),
|
|
|
|
),
|
|
|
|
)),
|
|
|
|
Padding(
|
|
|
|
padding: EdgeInsets.all(ScreenUtil().setWidth(40)),
|
|
|
|
child: _getGridImg(
|
|
|
|
_onlineCheckEditProvider.imageList.length < MAX_IMAGE_NUMBER
|
|
|
|
? _onlineCheckEditProvider.imageList.length + 1
|
|
|
|
: _onlineCheckEditProvider.imageList.length,
|
|
|
|
context,
|
|
|
|
_onlineCheckEditProvider.imageList.length == MAX_IMAGE_NUMBER
|
|
|
|
? true
|
|
|
|
: false),
|
|
|
|
)
|
|
|
|
// _getGridImg(1, context)
|
|
|
|
],
|
|
|
|
),
|
|
|
|
);
|
|
|
|
_uploadImageProvider =
|
|
|
|
Provider.of<UploadImageProvider>(context, listen: true);
|
|
|
|
return _getGridImg(
|
|
|
|
_uploadImageProvider.imageList.length < widget.maxImageNumber
|
|
|
|
? _uploadImageProvider.imageList.length + 1
|
|
|
|
: _uploadImageProvider.imageList.length,
|
|
|
|
context,
|
|
|
|
_uploadImageProvider.imageList.length == widget.maxImageNumber
|
|
|
|
? true
|
|
|
|
: false);
|
|
|
|
}
|
|
|
|
|
|
|
|
/// 九宫格
|
|
|
|
Widget _getGridImg(count, context, isLinjie) {
|
|
|
|
OnlineCheckEditProvider _provider =
|
|
|
|
Provider.of<OnlineCheckEditProvider>(context, listen: false);
|
|
|
|
return GridView.builder(
|
|
|
|
controller: widget.scrollController,
|
|
|
|
// padding: EdgeInsets.only(top: ScreenUtil().getAdapterSize(10)),
|
|
...
|
...
|
@@ -475,9 +441,9 @@ class _ImgPickerWidgetState extends DisposableState<ImgPickerWidget> { |
|
|
|
childAspectRatio: 1.0),
|
|
|
|
itemBuilder: (BuildContext context, int index) {
|
|
|
|
//Widget Function(BuildContext context, int index)
|
|
|
|
var linjie = MAX_IMAGE_NUMBER;
|
|
|
|
var linjie = widget.maxImageNumber;
|
|
|
|
if (isLinjie) {
|
|
|
|
linjie = MAX_IMAGE_NUMBER - 1;
|
|
|
|
linjie = widget.maxImageNumber - 1;
|
|
|
|
}
|
|
|
|
if (index == count - 1 && index < linjie) {
|
|
|
|
return InkWell(
|
|
...
|
...
|
@@ -513,25 +479,24 @@ class _ImgPickerWidgetState extends DisposableState<ImgPickerWidget> { |
|
|
|
)),
|
|
|
|
);
|
|
|
|
}
|
|
|
|
return _provider.imageList.length < 1
|
|
|
|
return _uploadImageProvider.imageList.length < 1
|
|
|
|
? Text('')
|
|
|
|
: InkWell(
|
|
|
|
onTap: () {
|
|
|
|
if (_onlineCheckEditProvider.imageList[index].process ==
|
|
|
|
1) {
|
|
|
|
_onlineCheckEditProvider.imageQiniuUrlList = [];
|
|
|
|
if (_onlineCheckEditProvider.imageList[index].qiniuUrl !=
|
|
|
|
if (_uploadImageProvider.imageList[index].process == 1) {
|
|
|
|
_uploadImageProvider.imageQiniuUrlList = [];
|
|
|
|
if (_uploadImageProvider.imageList[index].qiniuUrl !=
|
|
|
|
null) {
|
|
|
|
for (int i = 0;
|
|
|
|
i < _onlineCheckEditProvider.imageList.length;
|
|
|
|
i < _uploadImageProvider.imageList.length;
|
|
|
|
i++) {
|
|
|
|
_onlineCheckEditProvider.imageQiniuUrlList.add(
|
|
|
|
_onlineCheckEditProvider.imageList[i].qiniuUrl);
|
|
|
|
_uploadImageProvider.imageQiniuUrlList
|
|
|
|
.add(_uploadImageProvider.imageList[i].qiniuUrl);
|
|
|
|
}
|
|
|
|
|
|
|
|
///没有上传完成的不可以点击
|
|
|
|
_showPhotoView(
|
|
|
|
context, index, _provider.imageQiniuUrlList);
|
|
|
|
_showPhotoView(context, index,
|
|
|
|
_uploadImageProvider.imageQiniuUrlList);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
},
|
|
...
|
...
|
@@ -541,13 +506,15 @@ class _ImgPickerWidgetState extends DisposableState<ImgPickerWidget> { |
|
|
|
alignment: Alignment.topRight,
|
|
|
|
children: [
|
|
|
|
Image.file(
|
|
|
|
_provider.imageList[index].file,
|
|
|
|
_uploadImageProvider.imageList[index].file,
|
|
|
|
fit: BoxFit.cover,
|
|
|
|
width: ScreenUtil().setWidth(100 * 2),
|
|
|
|
height: ScreenUtil().setWidth(100 * 2),
|
|
|
|
),
|
|
|
|
Offstage(
|
|
|
|
offstage: _provider.imageList[index].process < 1,
|
|
|
|
offstage:
|
|
|
|
_uploadImageProvider.imageList[index].process <
|
|
|
|
1,
|
|
|
|
child: GestureDetector(
|
|
|
|
child: Image.asset(
|
|
|
|
Utils.getImgPath("delete"),
|
|
...
|
...
|
@@ -557,12 +524,16 @@ class _ImgPickerWidgetState extends DisposableState<ImgPickerWidget> { |
|
|
|
onTap: () {
|
|
|
|
//点击删除按钮
|
|
|
|
setState(() {
|
|
|
|
_provider.imageList.removeWhere((element) =>
|
|
|
|
element == _provider.imageList[index]);
|
|
|
|
_provider.imageQiniuUrlList.removeWhere(
|
|
|
|
_uploadImageProvider.imageList.removeWhere(
|
|
|
|
(element) =>
|
|
|
|
element ==
|
|
|
|
_provider.imageQiniuUrlList[index]);
|
|
|
|
_uploadImageProvider
|
|
|
|
.imageList[index]);
|
|
|
|
_uploadImageProvider.imageQiniuUrlList
|
|
|
|
.removeWhere((element) =>
|
|
|
|
element ==
|
|
|
|
_uploadImageProvider
|
|
|
|
.imageQiniuUrlList[index]);
|
|
|
|
});
|
|
|
|
},
|
|
|
|
),
|
|
...
|
...
|
@@ -570,8 +541,10 @@ class _ImgPickerWidgetState extends DisposableState<ImgPickerWidget> { |
|
|
|
],
|
|
|
|
),
|
|
|
|
Offstage(
|
|
|
|
offstage: _provider.imageList[index].process == 1,
|
|
|
|
child: Progress(_provider.imageList[index].process),
|
|
|
|
offstage:
|
|
|
|
_uploadImageProvider.imageList[index].process == 1,
|
|
|
|
child: Progress(
|
|
|
|
_uploadImageProvider.imageList[index].process),
|
|
|
|
)
|
|
|
|
],
|
|
|
|
));
|
...
|
...
|
|