import 'dart:io'; import 'package:dating_touchme_app/network/user_api.dart'; import 'package:dating_touchme_app/oss/oss_manager.dart'; import 'package:flustars/flustars.dart'; import 'package:flutter/material.dart'; import 'package:flutter_smart_dialog/flutter_smart_dialog.dart'; import 'package:get/get.dart'; import 'package:image_picker/image_picker.dart'; import 'package:permission_handler/permission_handler.dart'; class RealFeedbackController extends GetxController { final int type; RealFeedbackController({required this.type}); late UserApi _userApi; final message = ''.obs; final messageController = TextEditingController().obs; final tagList = [].obs; final active = 0.obs; final imgList = [].obs; changeActive(int i){ active.value = i; } @override void onInit() { super.onInit(); _userApi = Get.find(); if(type == 1){ tagList.value = [ {"label": "账号异常", "value": 101}, {"label": "违规与封禁", "value": 102}, {"label": "头像/签名/实名认证", "value": 103}, ]; } else if(type == 2){ tagList.value = [ {"label": "私信相关", "value": 201}, {"label": "资料相关", "value": 202}, {"label": "动态相关", "value": 203}, {"label": "直播间相关", "value": 204}, ]; } else if(type == 3){ tagList.value = [ {"label": "举报有人诈骗", "value": 301}, {"label": "举报有人涉嫌诱导", "value": 302}, {"label": "其他不良行为举报", "value": 303}, {"label": "虚假宣传广告投诉", "value": 304}, {"label": "未成年问题", "value": 305}, {"label": "智能推荐相关", "value": 306}, ]; } } // 选择头像 - 业务逻辑处理 Future handleCameraCapture() async { try { // 请求相机权限 final ok = await _ensurePermission( Permission.camera, denyToast: '相机权限被拒绝,请在设置中允许访问相机', ); if (!ok) return; // 请求麦克风权限(部分设备拍照/录像会一并请求建议预授权) await _ensurePermission(Permission.microphone, denyToast: '麦克风权限被拒绝'); // 权限通过后拍照 final ImagePicker picker = ImagePicker(); final XFile? photo = await picker.pickImage(source: ImageSource.camera); if (photo != null) { await processSelectedImage(File(photo.path)); } } catch (e) { print('拍照失败: $e'); // 更友好的错误提示 if (e.toString().contains('permission') || e.toString().contains('权限')) { SmartDialog.showToast('相机权限被拒绝,请在设置中允许访问相机'); } else if (e.toString().contains('camera') || e.toString().contains('相机')) { SmartDialog.showToast('设备没有可用的相机'); } else { SmartDialog.showToast('拍照失败,请重试'); } } } Future handleGallerySelection() async { try { // 请求相册/照片权限 // final ok = await _ensurePermission( // Permission.photos, // // Android 上 photos 等价于 storage/mediaLibrary,permission_handler 会映射 // denyToast: '相册权限被拒绝,请在设置中允许访问相册', // ); // if (!ok) return; // 从相册选择图片 final ImagePicker picker = ImagePicker(); final XFile? image = await picker.pickImage(source: ImageSource.gallery); if (image != null) { await processSelectedImage(File(image.path)); } } catch (e) { print('选择图片失败: $e'); // 更友好的错误提示 if (e.toString().contains('permission') || e.toString().contains('权限')) { SmartDialog.showToast('相册权限被拒绝,请在设置中允许访问相册'); } else { SmartDialog.showToast('选择图片失败,请重试'); } } } Future handleMultiGallerySelection() async { try { // 请求相册/照片权限 // final ok = await _ensurePermission( // Permission.photos, // // Android 上 photos 等价于 storage/mediaLibrary,permission_handler 会映射 // denyToast: '相册权限被拒绝,请在设置中允许访问相册', // ); // if (!ok) return; // 从相册选择图片 final ImagePicker picker = ImagePicker(); final List? image = await picker.pickMultiImage(limit: 9 - imgList.length); if (image != null) { final futures = image.map((e){ return processSelectedMoreImage(File(e.path)); }); final list = await Future.wait(futures); imgList.addAll(list); print(imgList); SmartDialog.dismiss(); SmartDialog.showToast('上传相册成功'); } } catch (e) { print('选择图片失败: $e'); // 更友好的错误提示 if (e.toString().contains('permission') || e.toString().contains('权限')) { SmartDialog.showToast('相册权限被拒绝,请在设置中允许访问相册'); } else { SmartDialog.showToast('选择图片失败,请重试'); } } } // 通用权限申请 Future _ensurePermission(Permission permission, {String? denyToast}) async { var status = await permission.status; if (status.isGranted) return true; if (status.isDenied || status.isRestricted || status.isLimited) { status = await permission.request(); if (status.isGranted) return true; if (denyToast != null) SmartDialog.showToast(denyToast); return false; } if (status.isPermanentlyDenied) { if (denyToast != null) SmartDialog.showToast('$denyToast,前往系统设置开启'); // 延迟弹设置,避免与弹窗冲突 Future.delayed(const Duration(milliseconds: 300), openAppSettings); return false; } return false; } // 处理选中的图片 Future processSelectedImage(File imageFile) async { try { // 显示加载提示 SmartDialog.showLoading(msg: '上传相册中...'); String objectName = '${DateUtil.getNowDateMs()}.${imageFile.path.split('.').last}'; String imageUrl = await OSSManager.instance.uploadFile(imageFile.readAsBytesSync(), objectName); print('上传成功,图片URL: $imageUrl'); imgList.add(imageUrl); SmartDialog.dismiss(); SmartDialog.showToast('相册上传成功'); } catch (e) { SmartDialog.dismiss(); print('处理图片失败: $e'); SmartDialog.showToast('上传相册失败,请重试'); } } // 处理选中的图片 Future processSelectedMoreImage(File imageFile) async { try { // 显示加载提示 SmartDialog.showLoading(msg: '上传相册中...'); String objectName = '${DateUtil.getNowDateMs()}.${imageFile.path.split('.').last}'; String imageUrl = await OSSManager.instance.uploadFile(imageFile.readAsBytesSync(), objectName); print('上传成功,图片URL: $imageUrl'); return imageUrl; } catch (e) { SmartDialog.dismiss(); print('处理图片失败: $e'); SmartDialog.showToast('上传相册失败,请重试'); return ""; } } sendFeedback() async { try { final response = await _userApi.userCreateUserFeedback({ "images": imgList.isNotEmpty ? imgList.join(",") : "", "content": message.value, "feedbackType": active.value, }); if (response.data.isSuccess) { SmartDialog.showToast('反馈已提交成功'); Get.until((route) => route.isFirst); } else { // 响应失败,抛出异常 throw Exception(response.data.message ?? '获取数据失败'); } } catch(e){ print('反馈提交失败: $e'); SmartDialog.showToast('反馈提交失败'); rethrow; } finally { } } }