import 'package:dio/dio.dart'; import 'package:flutter_riverpod/flutter_riverpod.dart'; import '../core/network/api_exception.dart'; import '../core/network/dio_client.dart'; import '../models/ocr_result.dart'; final ocrApiProvider = Provider((ref) => OcrApi(ref.watch(dioProvider))); class OcrApi { final Dio _dio; OcrApi(this._dio); /// 上传图片识别账单,字段名固定为 file(与 uniApp upload 对齐)。 /// 后端可能返回裸数组或 {code, data:[...]},两种都兼容。 Future> recognize(String filePath) async { try { final formData = FormData.fromMap({ 'file': await MultipartFile.fromFile(filePath, filename: 'receipt.jpg'), }); final res = await _dio.post('/ocr/recognize', data: formData); final data = res.data; List list; if (data is List) { list = data; } else if (data is Map && data['data'] is List) { list = data['data'] as List; } else { throw ApiException(-1, '未识别到账单信息'); } return list .whereType>() .map(OcrResult.fromJson) .toList(); } on DioException catch (e) { final err = e.error; throw err is ApiException ? err : ApiException(-1, '识别失败,请重试'); } } }