You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

130 lines
3.8 KiB

import 'package:flutter/material.dart';
import 'package:get/get.dart';
import 'package:image_picker/image_picker.dart';
import '../controllers/problem_controller.dart';
import 'package:permission_handler/permission_handler.dart';
class AddProblemController extends GetxController {
final ProblemController _problemController = Get.put(ProblemController());
final RxList<XFile> _selectedImages = <XFile>[].obs;
final TextEditingController descriptionController = TextEditingController();
final TextEditingController locationController = TextEditingController();
final RxBool isLoading = false.obs;
List<XFile> get selectedImages => _selectedImages;
// 改进的 pickImage 方法
Future<void> pickImage(ImageSource source) async {
try {
PermissionStatus status;
String permissionName;
String actionName;
if (source == ImageSource.camera) {
permissionName = "相机";
actionName = "拍照";
status = await Permission.camera.request();
} else {
permissionName = "相册";
actionName = "选择图片";
// 处理不同 Android 版本的相册权限
if (await Permission.photos.isGranted) {
status = PermissionStatus.granted;
} else if (await Permission.storage.isGranted) {
status = PermissionStatus.granted;
} else {
// 请求适当的权限
status = await Permission.photos.request();
// 如果 photos 权限被拒绝,尝试请求 storage 权限
if (status.isDenied || status.isPermanentlyDenied) {
status = await Permission.storage.request();
}
}
}
if (status.isGranted) {
final ImagePicker picker = ImagePicker();
final XFile? image = await picker.pickImage(source: source);
if (image != null) {
_selectedImages.add(image);
}
} else if (status.isPermanentlyDenied) {
// 权限被永久拒绝,引导用户到设置
_showPermissionDeniedDialog(permissionName, actionName);
} else {
Get.snackbar('权限被拒绝', '需要$permissionName权限才能$actionName');
}
} catch (e) {
Get.snackbar('错误', '选择图片失败: $e');
}
}
// 显示权限被拒绝的对话框
void _showPermissionDeniedDialog(String permissionName, String actionName) {
Get.dialog(
AlertDialog(
title: Text('权限被拒绝'),
content: Text('需要$permissionName权限才能$actionName。是否要前往设置开启权限?'),
actions: [
TextButton(onPressed: () => Get.back(), child: Text('取消')),
TextButton(
onPressed: () async {
Get.back();
await openAppSettings();
},
child: Text('去设置'),
),
],
),
);
}
Future<void> removeImage(int index) async {
_selectedImages.removeAt(index);
}
bool get isFormValid {
return descriptionController.text.isNotEmpty &&
locationController.text.isNotEmpty;
}
Future<void> saveProblem() async {
if (descriptionController.text.isEmpty) {
Get.snackbar('错误', '请填写问题描述');
return;
}
isLoading.value = true;
try {
await _problemController.addProblem(
descriptionController.text,
locationController.text,
_selectedImages.toList(),
);
// 清空表单
descriptionController.clear();
locationController.clear();
_selectedImages.clear();
Get.back();
Get.snackbar('成功', '问题已保存');
} catch (e) {
Get.snackbar('错误', '保存问题失败: $e');
} finally {
isLoading.value = false;
}
}
@override
void onClose() {
descriptionController.dispose();
locationController.dispose();
super.onClose();
}
}