master
jack ning 3 years ago
parent dcd34c17ed
commit 8414606bfa

@ -46,7 +46,7 @@ dependencies:
# 请在ios/Podfile中添加use_frameworks!
vibration: ^1.7.3
# 在线客服 https://pub.dev/packages/bytedesk_kefu
bytedesk_kefu: ^1.2.9
bytedesk_kefu: ^1.3.0
# The following adds the Cupertino Icons font to your application.
# Use with the CupertinoIcons class for iOS style icons.

@ -27,8 +27,7 @@ class LeaveMsgBloc extends Bloc<LeaveMsgEvent, LeaveMsgState> {
SubmitLeaveMsgEvent event, Emitter<LeaveMsgState> emit) async {
emit(LeaveMsgSubmiting());
try {
// final JsonResult jsonResult =
await leaveMsgRepository.submitLeaveMsg(event.content, event.imageUrls);
await leaveMsgRepository.submitLeaveMsg(event.wid, event.aid, event.type, event.mobile, event.email, event.content);
emit(LeaveMsgSubmitSuccessState());
} catch (error) {
print(error);

@ -15,10 +15,15 @@ class GetLeaveMsgCategoryEvent extends LeaveMsgEvent {
}
class SubmitLeaveMsgEvent extends LeaveMsgEvent {
final List<String>? imageUrls;
// final List<String>? imageUrls;
final String? wid;
final String? aid;
final String? type;
final String? mobile;
final String? email;
final String? content;
SubmitLeaveMsgEvent({@required this.content, @required this.imageUrls})
// @required this.imageUrls
SubmitLeaveMsgEvent({@required this.wid, @required this.aid, @required this.type, @required this.mobile, @required this.email, @required this.content})
: super();
}

@ -33,14 +33,12 @@ class BytedeskLeaveMsgHttpApi extends BytedeskBaseHttpApi {
return categories;
}
// TODO:
Future<JsonResult> submitLeaveMsg(
String? content, List<String>? imageUrls) async {
// TODO: , List<String>? imageUrls
Future<JsonResult> submitLeaveMsg(String? wid, String? aid, String? type,
String? mobile, String? email, String? content) async {
//
var body = json.encode({"content": content, "client": client});
//
// final initUrl = '$baseUrl/api/feedback/create';
final initUrl = Uri.http(BytedeskConstants.host, '/api/leavemsg/create');
var body = json.encode({"wid": wid, "aid": aid, "type": type, "mobile": mobile, "email": email,"content": content, "client": client});
final initUrl = Uri.http(BytedeskConstants.host, '/api/leavemsg/save');
final initResponse =
await this.httpClient.post(initUrl, headers: getHeaders(), body: body);
//json
@ -48,12 +46,12 @@ class BytedeskLeaveMsgHttpApi extends BytedeskBaseHttpApi {
//string json
final responseJson =
json.decode(utf8decoder.convert(initResponse.bodyBytes));
print("responseJson $responseJson");
print("submitLeaveMsg:");
print(responseJson);
// token
if (responseJson.toString().contains('invalid_token')) {
bytedeskEventBus.fire(InvalidTokenEventBus());
}
// return User.fromJson(responseJson);
return JsonResult();
}

@ -11,9 +11,9 @@ class LeaveMsgRepository {
return await bytedeskHttpApi.getHelpLeaveMsgCategories(uid);
}
Future<JsonResult> submitLeaveMsg(
String? content, List<String>? imageUrls) async {
return await bytedeskHttpApi.submitLeaveMsg(content, imageUrls);
// , List<String>? imageUrls
Future<JsonResult> submitLeaveMsg(String? wid, String? aid, String? type, String? mobile, String? email, String? content) async {
return await bytedeskHttpApi.submitLeaveMsg(wid, aid, type, mobile, email, content);
}
Future<String> upload(String? filePath) async {

@ -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) {
// GridViewitem
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) {
// // GridViewitem
// 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: "未选取图片");
// }
// }
}

@ -45,7 +45,7 @@ class BytedeskConstants {
// static const String httpBaseUrliOS = 'http://' + mqttHost + ':8000';
// static const String httpUploadUrl = 'http://' + mqttHost + ':8000';
// static const String host = mqttHost + ':8000';
// static const String mqttHost = '192.168.0.104';
// static const String mqttHost = '192.168.0.102';
// 线
static const bool isDebug = false; // false;

Loading…
Cancel
Save