|
|
|
@ -1,12 +1,12 @@
|
|
|
|
|
import 'dart:io';
|
|
|
|
|
// import 'dart:io';
|
|
|
|
|
|
|
|
|
|
import 'package:bytedesk_kefu/blocs/leavemsg_bloc/bloc.dart';
|
|
|
|
|
import 'package:bytedesk_kefu/ui/widget/image_choose_widget.dart';
|
|
|
|
|
// import 'package:bytedesk_kefu/ui/widget/image_choose_widget.dart';
|
|
|
|
|
import 'package:bytedesk_kefu/ui/widget/my_button.dart';
|
|
|
|
|
import 'package:flutter/material.dart';
|
|
|
|
|
import 'package:flutter_bloc/flutter_bloc.dart';
|
|
|
|
|
import 'package:fluttertoast/fluttertoast.dart';
|
|
|
|
|
import 'package:image_picker/image_picker.dart';
|
|
|
|
|
// import 'package:image_picker/image_picker.dart';
|
|
|
|
|
|
|
|
|
|
class LeaveMsgPage extends StatefulWidget {
|
|
|
|
|
//
|
|
|
|
@ -15,6 +15,10 @@ class LeaveMsgPage extends StatefulWidget {
|
|
|
|
|
final String? type;
|
|
|
|
|
final String? tip;
|
|
|
|
|
//
|
|
|
|
|
// String? mobile;
|
|
|
|
|
// String? email;
|
|
|
|
|
// String? content;
|
|
|
|
|
//
|
|
|
|
|
LeaveMsgPage(
|
|
|
|
|
{Key? key,
|
|
|
|
|
@required this.wid,
|
|
|
|
@ -30,11 +34,13 @@ class LeaveMsgPage extends StatefulWidget {
|
|
|
|
|
class _LeaveMsgPageState extends State<LeaveMsgPage> {
|
|
|
|
|
//
|
|
|
|
|
ScrollController _scrollController = new ScrollController(); // 滚动监听
|
|
|
|
|
TextEditingController _textEditController = new TextEditingController();
|
|
|
|
|
ImagePicker picker = ImagePicker();
|
|
|
|
|
List<String> _imageUrls = [];
|
|
|
|
|
List<File> _fileList = [];
|
|
|
|
|
File? _selectedImageFile;
|
|
|
|
|
// TextEditingController _nameEditController = new TextEditingController();
|
|
|
|
|
TextEditingController _mobileEditController = new TextEditingController();
|
|
|
|
|
TextEditingController _contentEditController = new TextEditingController();
|
|
|
|
|
// ImagePicker picker = ImagePicker();
|
|
|
|
|
// List<String> _imageUrls = [];
|
|
|
|
|
// List<File> _fileList = [];
|
|
|
|
|
// File? _selectedImageFile;
|
|
|
|
|
// List<MultipartFile> mSubmitFileList = [];
|
|
|
|
|
|
|
|
|
|
@override
|
|
|
|
@ -55,11 +61,11 @@ class _LeaveMsgPageState extends State<LeaveMsgPage> {
|
|
|
|
|
@override
|
|
|
|
|
Widget build(BuildContext context) {
|
|
|
|
|
//
|
|
|
|
|
print('fileList的内容: $_fileList');
|
|
|
|
|
if (_selectedImageFile != null) {
|
|
|
|
|
_fileList.add(_selectedImageFile!);
|
|
|
|
|
}
|
|
|
|
|
_selectedImageFile = null;
|
|
|
|
|
// print('fileList的内容: $_fileList');
|
|
|
|
|
// if (_selectedImageFile != null) {
|
|
|
|
|
// _fileList.add(_selectedImageFile!);
|
|
|
|
|
// }
|
|
|
|
|
// _selectedImageFile = null;
|
|
|
|
|
//
|
|
|
|
|
// TODO: 右上角增加:我的留言,查看留言记录及回复
|
|
|
|
|
return Scaffold(
|
|
|
|
@ -74,10 +80,10 @@ class _LeaveMsgPageState extends State<LeaveMsgPage> {
|
|
|
|
|
child: InkWell(
|
|
|
|
|
onTap: () {
|
|
|
|
|
// 提交
|
|
|
|
|
BlocProvider.of<LeaveMsgBloc>(context)
|
|
|
|
|
..add(SubmitLeaveMsgEvent(
|
|
|
|
|
imageUrls: _imageUrls,
|
|
|
|
|
content: _textEditController.text));
|
|
|
|
|
// BlocProvider.of<LeaveMsgBloc>(context)
|
|
|
|
|
// ..add(SubmitLeaveMsgEvent(
|
|
|
|
|
// imageUrls: _imageUrls,
|
|
|
|
|
// content: _contentEditController.text));
|
|
|
|
|
},
|
|
|
|
|
child: Text(
|
|
|
|
|
'提交',
|
|
|
|
@ -95,9 +101,9 @@ class _LeaveMsgPageState extends State<LeaveMsgPage> {
|
|
|
|
|
Fluttertoast.showToast(msg: '上传图片中');
|
|
|
|
|
} else if (state is UploadImageSuccess) {
|
|
|
|
|
// 图片url
|
|
|
|
|
if (!_imageUrls.contains(state.url)) {
|
|
|
|
|
_imageUrls.add(state.url);
|
|
|
|
|
}
|
|
|
|
|
// if (!_imageUrls.contains(state.url)) {
|
|
|
|
|
// _imageUrls.add(state.url);
|
|
|
|
|
// }
|
|
|
|
|
} else if (state is LeaveMsgSubmiting) {
|
|
|
|
|
Fluttertoast.showToast(msg: '提交留言中');
|
|
|
|
|
} else if (state is LeaveMsgSubmitSuccessState) {
|
|
|
|
@ -113,6 +119,44 @@ class _LeaveMsgPageState extends State<LeaveMsgPage> {
|
|
|
|
|
padding: EdgeInsets.only(top: 5.0, left: 10, right: 10),
|
|
|
|
|
child: Column(
|
|
|
|
|
children: <Widget>[
|
|
|
|
|
// Container(
|
|
|
|
|
// // constraints: BoxConstraints(
|
|
|
|
|
// // minHeight: 150,
|
|
|
|
|
// // ),
|
|
|
|
|
// // color: Color(0xffffffff),
|
|
|
|
|
// margin: EdgeInsets.only(top: 15),
|
|
|
|
|
// child: TextField(
|
|
|
|
|
// controller: _nameEditController,
|
|
|
|
|
// // maxLines: 5,
|
|
|
|
|
// // maxLength: 500,
|
|
|
|
|
// decoration: InputDecoration(
|
|
|
|
|
// hintText: "称呼",
|
|
|
|
|
// hintStyle:
|
|
|
|
|
// TextStyle(color: Color(0xff999999), fontSize: 16),
|
|
|
|
|
// contentPadding: EdgeInsets.only(left: 15, right: 15),
|
|
|
|
|
// border: InputBorder.none,
|
|
|
|
|
// ),
|
|
|
|
|
// ),
|
|
|
|
|
// ),
|
|
|
|
|
Container(
|
|
|
|
|
// constraints: BoxConstraints(
|
|
|
|
|
// minHeight: 150,
|
|
|
|
|
// ),
|
|
|
|
|
// color: Color(0xffffffff),
|
|
|
|
|
margin: EdgeInsets.only(top: 15),
|
|
|
|
|
child: TextField(
|
|
|
|
|
controller: _mobileEditController,
|
|
|
|
|
// maxLines: 5,
|
|
|
|
|
// maxLength: 500,
|
|
|
|
|
decoration: InputDecoration(
|
|
|
|
|
hintText: "手机号",
|
|
|
|
|
hintStyle:
|
|
|
|
|
TextStyle(color: Color(0xff999999), fontSize: 16),
|
|
|
|
|
contentPadding: EdgeInsets.only(left: 15, right: 15),
|
|
|
|
|
border: InputBorder.none,
|
|
|
|
|
),
|
|
|
|
|
),
|
|
|
|
|
),
|
|
|
|
|
Container(
|
|
|
|
|
constraints: BoxConstraints(
|
|
|
|
|
minHeight: 150,
|
|
|
|
@ -120,11 +164,11 @@ class _LeaveMsgPageState extends State<LeaveMsgPage> {
|
|
|
|
|
// color: Color(0xffffffff),
|
|
|
|
|
margin: EdgeInsets.only(top: 15),
|
|
|
|
|
child: TextField(
|
|
|
|
|
controller: _textEditController,
|
|
|
|
|
controller: _contentEditController,
|
|
|
|
|
maxLines: 5,
|
|
|
|
|
maxLength: 500,
|
|
|
|
|
decoration: InputDecoration(
|
|
|
|
|
hintText: "快说点儿什么吧......",
|
|
|
|
|
hintText: "留言内容",
|
|
|
|
|
hintStyle:
|
|
|
|
|
TextStyle(color: Color(0xff999999), fontSize: 16),
|
|
|
|
|
contentPadding: EdgeInsets.only(left: 15, right: 15),
|
|
|
|
@ -132,86 +176,94 @@ class _LeaveMsgPageState extends State<LeaveMsgPage> {
|
|
|
|
|
),
|
|
|
|
|
),
|
|
|
|
|
),
|
|
|
|
|
GridView.count(
|
|
|
|
|
shrinkWrap: true,
|
|
|
|
|
primary: false,
|
|
|
|
|
crossAxisCount: 3,
|
|
|
|
|
children: List.generate(_fileList.length + 1, (index) {
|
|
|
|
|
// 这个方法体用于生成GridView中的一个item
|
|
|
|
|
var content;
|
|
|
|
|
if (index == _fileList.length) {
|
|
|
|
|
// 添加图片按钮
|
|
|
|
|
var addCell = Center(
|
|
|
|
|
child: Image.asset(
|
|
|
|
|
'assets/images/feedback/mine_feedback_add_image.png',
|
|
|
|
|
width: double.infinity,
|
|
|
|
|
height: double.infinity,
|
|
|
|
|
));
|
|
|
|
|
content = GestureDetector(
|
|
|
|
|
onTap: () {
|
|
|
|
|
// 添加图片
|
|
|
|
|
// pickImage(context);
|
|
|
|
|
showModalBottomSheet(
|
|
|
|
|
context: context,
|
|
|
|
|
builder: (context) {
|
|
|
|
|
return ImageChooseWidget(
|
|
|
|
|
pickImageCallBack: () {
|
|
|
|
|
_pickImage();
|
|
|
|
|
},
|
|
|
|
|
takeImageCallBack: () {
|
|
|
|
|
_takeImage();
|
|
|
|
|
},
|
|
|
|
|
);
|
|
|
|
|
});
|
|
|
|
|
},
|
|
|
|
|
child: addCell,
|
|
|
|
|
);
|
|
|
|
|
} else {
|
|
|
|
|
// 被选中的图片
|
|
|
|
|
content = Stack(
|
|
|
|
|
children: <Widget>[
|
|
|
|
|
Center(
|
|
|
|
|
child: Image.file(
|
|
|
|
|
_fileList[index],
|
|
|
|
|
width: double.infinity,
|
|
|
|
|
height: double.infinity,
|
|
|
|
|
fit: BoxFit.cover,
|
|
|
|
|
),
|
|
|
|
|
),
|
|
|
|
|
Align(
|
|
|
|
|
alignment: Alignment.topRight,
|
|
|
|
|
child: InkWell(
|
|
|
|
|
onTap: () {
|
|
|
|
|
_fileList.removeAt(index);
|
|
|
|
|
_selectedImageFile = null;
|
|
|
|
|
setState(() {});
|
|
|
|
|
},
|
|
|
|
|
child: Image.asset(
|
|
|
|
|
'assets/images/feedback/mine_feedback_ic_del.png',
|
|
|
|
|
width: 20.0,
|
|
|
|
|
height: 20.0,
|
|
|
|
|
),
|
|
|
|
|
),
|
|
|
|
|
)
|
|
|
|
|
],
|
|
|
|
|
);
|
|
|
|
|
}
|
|
|
|
|
return Container(
|
|
|
|
|
margin: const EdgeInsets.all(10.0),
|
|
|
|
|
width: 80.0,
|
|
|
|
|
height: 80.0,
|
|
|
|
|
color: const Color(0xFFffffff),
|
|
|
|
|
child: content,
|
|
|
|
|
);
|
|
|
|
|
}),
|
|
|
|
|
),
|
|
|
|
|
// GridView.count(
|
|
|
|
|
// shrinkWrap: true,
|
|
|
|
|
// primary: false,
|
|
|
|
|
// crossAxisCount: 3,
|
|
|
|
|
// children: List.generate(_fileList.length + 1, (index) {
|
|
|
|
|
// // 这个方法体用于生成GridView中的一个item
|
|
|
|
|
// var content;
|
|
|
|
|
// if (index == _fileList.length) {
|
|
|
|
|
// // 添加图片按钮
|
|
|
|
|
// var addCell = Center(
|
|
|
|
|
// child: Image.asset(
|
|
|
|
|
// 'assets/images/feedback/mine_feedback_add_image.png',
|
|
|
|
|
// width: double.infinity,
|
|
|
|
|
// height: double.infinity,
|
|
|
|
|
// ));
|
|
|
|
|
// content = GestureDetector(
|
|
|
|
|
// onTap: () {
|
|
|
|
|
// // 添加图片
|
|
|
|
|
// // pickImage(context);
|
|
|
|
|
// showModalBottomSheet(
|
|
|
|
|
// context: context,
|
|
|
|
|
// builder: (context) {
|
|
|
|
|
// return ImageChooseWidget(
|
|
|
|
|
// pickImageCallBack: () {
|
|
|
|
|
// _pickImage();
|
|
|
|
|
// },
|
|
|
|
|
// takeImageCallBack: () {
|
|
|
|
|
// _takeImage();
|
|
|
|
|
// },
|
|
|
|
|
// );
|
|
|
|
|
// });
|
|
|
|
|
// },
|
|
|
|
|
// child: addCell,
|
|
|
|
|
// );
|
|
|
|
|
// } else {
|
|
|
|
|
// // 被选中的图片
|
|
|
|
|
// content = Stack(
|
|
|
|
|
// children: <Widget>[
|
|
|
|
|
// Center(
|
|
|
|
|
// child: Image.file(
|
|
|
|
|
// _fileList[index],
|
|
|
|
|
// width: double.infinity,
|
|
|
|
|
// height: double.infinity,
|
|
|
|
|
// fit: BoxFit.cover,
|
|
|
|
|
// ),
|
|
|
|
|
// ),
|
|
|
|
|
// Align(
|
|
|
|
|
// alignment: Alignment.topRight,
|
|
|
|
|
// child: InkWell(
|
|
|
|
|
// onTap: () {
|
|
|
|
|
// _fileList.removeAt(index);
|
|
|
|
|
// _selectedImageFile = null;
|
|
|
|
|
// setState(() {});
|
|
|
|
|
// },
|
|
|
|
|
// child: Image.asset(
|
|
|
|
|
// 'assets/images/feedback/mine_feedback_ic_del.png',
|
|
|
|
|
// width: 20.0,
|
|
|
|
|
// height: 20.0,
|
|
|
|
|
// ),
|
|
|
|
|
// ),
|
|
|
|
|
// )
|
|
|
|
|
// ],
|
|
|
|
|
// );
|
|
|
|
|
// }
|
|
|
|
|
// return Container(
|
|
|
|
|
// margin: const EdgeInsets.all(10.0),
|
|
|
|
|
// width: 80.0,
|
|
|
|
|
// height: 80.0,
|
|
|
|
|
// color: const Color(0xFFffffff),
|
|
|
|
|
// child: content,
|
|
|
|
|
// );
|
|
|
|
|
// }),
|
|
|
|
|
// ),
|
|
|
|
|
MyButton(
|
|
|
|
|
onPressed: () {
|
|
|
|
|
//
|
|
|
|
|
// BlocProvider.of<LeaveMsgBloc>(context)
|
|
|
|
|
// ..add(SubmitLeaveMsgEvent(
|
|
|
|
|
// imageUrls: _imageUrls,
|
|
|
|
|
// content: _contentEditController.text));
|
|
|
|
|
BlocProvider.of<LeaveMsgBloc>(context)
|
|
|
|
|
..add(SubmitLeaveMsgEvent(
|
|
|
|
|
imageUrls: _imageUrls,
|
|
|
|
|
content: _textEditController.text));
|
|
|
|
|
wid: widget.wid,
|
|
|
|
|
aid: widget.aid,
|
|
|
|
|
type: widget.type,
|
|
|
|
|
mobile: _mobileEditController.text,
|
|
|
|
|
email: "",
|
|
|
|
|
content: _contentEditController.text));
|
|
|
|
|
},
|
|
|
|
|
text: '提交',
|
|
|
|
|
)
|
|
|
|
@ -222,46 +274,46 @@ class _LeaveMsgPageState extends State<LeaveMsgPage> {
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// 选择图片
|
|
|
|
|
Future<void> _pickImage() async {
|
|
|
|
|
if (_fileList.length >= 9) {
|
|
|
|
|
Fluttertoast.showToast(msg: "最多选取9张图片");
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
try {
|
|
|
|
|
XFile? pickedFile = await picker.pickImage(
|
|
|
|
|
source: ImageSource.gallery, maxWidth: 800, imageQuality: 95);
|
|
|
|
|
print('pick image path: ${pickedFile!.path}');
|
|
|
|
|
setState(() {
|
|
|
|
|
_selectedImageFile = File(pickedFile.path);
|
|
|
|
|
});
|
|
|
|
|
//
|
|
|
|
|
BlocProvider.of<LeaveMsgBloc>(context)
|
|
|
|
|
..add(UploadImageEvent(filePath: pickedFile.path));
|
|
|
|
|
} catch (e) {
|
|
|
|
|
print('pick image error ${e.toString()}');
|
|
|
|
|
Fluttertoast.showToast(msg: "未选取图片");
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
// Future<void> _pickImage() async {
|
|
|
|
|
// if (_fileList.length >= 9) {
|
|
|
|
|
// Fluttertoast.showToast(msg: "最多选取9张图片");
|
|
|
|
|
// return;
|
|
|
|
|
// }
|
|
|
|
|
// try {
|
|
|
|
|
// XFile? pickedFile = await picker.pickImage(
|
|
|
|
|
// source: ImageSource.gallery, maxWidth: 800, imageQuality: 95);
|
|
|
|
|
// print('pick image path: ${pickedFile!.path}');
|
|
|
|
|
// setState(() {
|
|
|
|
|
// _selectedImageFile = File(pickedFile.path);
|
|
|
|
|
// });
|
|
|
|
|
// //
|
|
|
|
|
// BlocProvider.of<LeaveMsgBloc>(context)
|
|
|
|
|
// ..add(UploadImageEvent(filePath: pickedFile.path));
|
|
|
|
|
// } catch (e) {
|
|
|
|
|
// print('pick image error ${e.toString()}');
|
|
|
|
|
// Fluttertoast.showToast(msg: "未选取图片");
|
|
|
|
|
// }
|
|
|
|
|
// }
|
|
|
|
|
|
|
|
|
|
// 拍照
|
|
|
|
|
Future<void> _takeImage() async {
|
|
|
|
|
if (_fileList.length >= 9) {
|
|
|
|
|
Fluttertoast.showToast(msg: "最多选取9张图片");
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
try {
|
|
|
|
|
XFile? pickedFile = await picker.pickImage(
|
|
|
|
|
source: ImageSource.camera, maxWidth: 800, imageQuality: 95);
|
|
|
|
|
print('take image path: ${pickedFile!.path}');
|
|
|
|
|
setState(() {
|
|
|
|
|
_selectedImageFile = File(pickedFile.path);
|
|
|
|
|
});
|
|
|
|
|
//
|
|
|
|
|
BlocProvider.of<LeaveMsgBloc>(context)
|
|
|
|
|
..add(UploadImageEvent(filePath: pickedFile.path));
|
|
|
|
|
} catch (e) {
|
|
|
|
|
print('take image error ${e.toString()}');
|
|
|
|
|
Fluttertoast.showToast(msg: "未选取图片");
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
// Future<void> _takeImage() async {
|
|
|
|
|
// if (_fileList.length >= 9) {
|
|
|
|
|
// Fluttertoast.showToast(msg: "最多选取9张图片");
|
|
|
|
|
// return;
|
|
|
|
|
// }
|
|
|
|
|
// try {
|
|
|
|
|
// XFile? pickedFile = await picker.pickImage(
|
|
|
|
|
// source: ImageSource.camera, maxWidth: 800, imageQuality: 95);
|
|
|
|
|
// print('take image path: ${pickedFile!.path}');
|
|
|
|
|
// setState(() {
|
|
|
|
|
// _selectedImageFile = File(pickedFile.path);
|
|
|
|
|
// });
|
|
|
|
|
// //
|
|
|
|
|
// BlocProvider.of<LeaveMsgBloc>(context)
|
|
|
|
|
// ..add(UploadImageEvent(filePath: pickedFile.path));
|
|
|
|
|
// } catch (e) {
|
|
|
|
|
// print('take image error ${e.toString()}');
|
|
|
|
|
// Fluttertoast.showToast(msg: "未选取图片");
|
|
|
|
|
// }
|
|
|
|
|
// }
|
|
|
|
|
}
|
|
|
|
|