import 'package:dio/dio.dart'; import 'package:get/get.dart' hide MultipartFile, FormData; import 'package:image_picker/image_picker.dart'; import 'package:path_provider/path_provider.dart'; import 'dart:io'; import '../models/problem_model.dart'; import '../services/local_database.dart'; class ProblemController extends GetxController { final LocalDatabase _localDatabase = LocalDatabase(); final RxList problems = [].obs; final RxBool isLoading = false.obs; // 这个方法返回所有已选中的问题对象 List get selectedProblems { return problems.where((p) => p.isChecked.value).toList(); } @override void onInit() { super.onInit(); loadProblems(); } Future loadProblems() async { isLoading.value = true; problems.value = await _localDatabase.getProblems(); isLoading.value = false; } Future addProblem( String description, String location, List images, ) async { try { // 保存图片到本地 final List imagePaths = []; final directory = await getApplicationDocumentsDirectory(); for (var i = 0; i < images.length; i++) { final String imagePath = '${directory.path}/problem_${DateTime.now().millisecondsSinceEpoch}_$i.jpg'; final File imageFile = File(imagePath); await imageFile.writeAsBytes(await images[i].readAsBytes()); imagePaths.add(imagePath); } final Problem problem = Problem( description: description, location: location, imagePaths: imagePaths, createdAt: DateTime.now(), isUploaded: false, ); await _localDatabase.insertProblem(problem); problems.add(problem); } catch (e) { Get.snackbar('错误', '保存问题失败: $e'); rethrow; } } Future uploadProblem(Problem problem) async { try { final dio = Dio(); // 准备表单数据 final formData = FormData.fromMap({ 'description': problem.description, 'location': problem.location, 'createdAt': problem.createdAt.toIso8601String(), 'boundInfo': problem.boundInfo ?? '', }); // 添加图片文件 for (var path in problem.imagePaths) { formData.files.add( MapEntry('images', await MultipartFile.fromFile(path)), ); } final response = await dio.post( 'https://your-server.com/api/problems', data: formData, ); if (response.statusCode == 200) { // 更新上传状态 problem.isUploaded = true; await _localDatabase.updateProblem(problem); problems.refresh(); Get.snackbar('成功', '问题已上传到服务器'); } } catch (e) { Get.snackbar('错误', '上传问题失败: $e'); } } Future uploadAllUnuploaded() async { final unuploaded = await _localDatabase.getUnuploadedProblems(); for (var problem in unuploaded) { await uploadProblem(problem); } } Future bindInfoToProblem(int problemId, String info) async { final problem = problems.firstWhere((p) => p.id == problemId); problem.boundInfo = info; await _localDatabase.updateProblem(problem); problems.refresh(); } }