215 lines
6.0 KiB
Dart
215 lines
6.0 KiB
Dart
/// مثال استفاده از Bug Report در Flutter
|
|
|
|
/// ابتدا مدلهای Dart را برای تطابق با API ایجاد کنید:
|
|
|
|
class BugReportRequest {
|
|
final String title;
|
|
final String description;
|
|
final String userEmail;
|
|
final int? accountId;
|
|
final String deviceModel;
|
|
final String osVersion;
|
|
final String platform;
|
|
final String manufacturer;
|
|
final String deviceId;
|
|
final String screenResolution;
|
|
final int memoryInMB;
|
|
final int storageInMB;
|
|
final int batteryLevel;
|
|
final bool isCharging;
|
|
final String networkType;
|
|
final String appVersion;
|
|
final String buildNumber;
|
|
final String packageName;
|
|
final DateTime installTime;
|
|
final DateTime lastUpdateTime;
|
|
final String flavor;
|
|
final int type; // BugReportType enum value
|
|
final int priority; // BugPriority enum value
|
|
final String? stackTrace;
|
|
final List<String>? logs;
|
|
final List<String>? screenshots; // Base64 encoded
|
|
|
|
BugReportRequest({
|
|
required this.title,
|
|
required this.description,
|
|
required this.userEmail,
|
|
this.accountId,
|
|
required this.deviceModel,
|
|
required this.osVersion,
|
|
required this.platform,
|
|
required this.manufacturer,
|
|
required this.deviceId,
|
|
required this.screenResolution,
|
|
required this.memoryInMB,
|
|
required this.storageInMB,
|
|
required this.batteryLevel,
|
|
required this.isCharging,
|
|
required this.networkType,
|
|
required this.appVersion,
|
|
required this.buildNumber,
|
|
required this.packageName,
|
|
required this.installTime,
|
|
required this.lastUpdateTime,
|
|
required this.flavor,
|
|
required this.type,
|
|
required this.priority,
|
|
this.stackTrace,
|
|
this.logs,
|
|
this.screenshots,
|
|
});
|
|
|
|
Map<String, dynamic> toJson() {
|
|
return {
|
|
'title': title,
|
|
'description': description,
|
|
'userEmail': userEmail,
|
|
'accountId': accountId,
|
|
'deviceModel': deviceModel,
|
|
'osVersion': osVersion,
|
|
'platform': platform,
|
|
'manufacturer': manufacturer,
|
|
'deviceId': deviceId,
|
|
'screenResolution': screenResolution,
|
|
'memoryInMB': memoryInMB,
|
|
'storageInMB': storageInMB,
|
|
'batteryLevel': batteryLevel,
|
|
'isCharging': isCharging,
|
|
'networkType': networkType,
|
|
'appVersion': appVersion,
|
|
'buildNumber': buildNumber,
|
|
'packageName': packageName,
|
|
'installTime': installTime.toIso8601String(),
|
|
'lastUpdateTime': lastUpdateTime.toIso8601String(),
|
|
'flavor': flavor,
|
|
'type': type,
|
|
'priority': priority,
|
|
'stackTrace': stackTrace,
|
|
'logs': logs,
|
|
'screenshots': screenshots,
|
|
};
|
|
}
|
|
}
|
|
|
|
/// سرویس برای ارسال Bug Report:
|
|
|
|
class BugReportService {
|
|
final Dio dio;
|
|
|
|
BugReportService(this.dio);
|
|
|
|
Future<bool> submitBugReport(BugReportRequest report) async {
|
|
try {
|
|
final response = await dio.post(
|
|
'/api/bugreport/submit',
|
|
data: report.toJson(),
|
|
options: Options(
|
|
validateStatus: (status) => status! < 500,
|
|
headers: {
|
|
'Content-Type': 'application/json',
|
|
},
|
|
),
|
|
);
|
|
|
|
return response.statusCode == 200;
|
|
} catch (e) {
|
|
print('Error submitting bug report: $e');
|
|
return false;
|
|
}
|
|
}
|
|
}
|
|
|
|
/// استفاده در یک Error Handler:
|
|
|
|
class AppErrorHandler {
|
|
final BugReportService bugReportService;
|
|
final DeviceInfoService deviceInfoService;
|
|
|
|
AppErrorHandler(this.bugReportService, this.deviceInfoService);
|
|
|
|
Future<void> handleError(
|
|
FlutterErrorDetails details, {
|
|
String? userEmail,
|
|
int? accountId,
|
|
String? bugTitle,
|
|
int bugType = 1, // Crash
|
|
int bugPriority = 1, // Critical
|
|
}) async {
|
|
try {
|
|
final deviceInfo = await deviceInfoService.getDeviceInfo();
|
|
final report = BugReportRequest(
|
|
title: bugTitle ?? 'برنامه کرش کرد',
|
|
description: details.exceptionAsString(),
|
|
userEmail: userEmail ?? 'unknown@example.com',
|
|
accountId: accountId,
|
|
deviceModel: deviceInfo['model'],
|
|
osVersion: deviceInfo['osVersion'],
|
|
platform: deviceInfo['platform'],
|
|
manufacturer: deviceInfo['manufacturer'],
|
|
deviceId: deviceInfo['deviceId'],
|
|
screenResolution: deviceInfo['screenResolution'],
|
|
memoryInMB: deviceInfo['memoryInMB'],
|
|
storageInMB: deviceInfo['storageInMB'],
|
|
batteryLevel: deviceInfo['batteryLevel'],
|
|
isCharging: deviceInfo['isCharging'],
|
|
networkType: deviceInfo['networkType'],
|
|
appVersion: deviceInfo['appVersion'],
|
|
buildNumber: deviceInfo['buildNumber'],
|
|
packageName: deviceInfo['packageName'],
|
|
installTime: deviceInfo['installTime'],
|
|
lastUpdateTime: deviceInfo['lastUpdateTime'],
|
|
flavor: deviceInfo['flavor'],
|
|
type: bugType,
|
|
priority: bugPriority,
|
|
stackTrace: details.stack.toString(),
|
|
logs: await _collectLogs(),
|
|
screenshots: await _captureScreenshots(),
|
|
);
|
|
|
|
await bugReportService.submitBugReport(report);
|
|
} catch (e) {
|
|
print('Error handling bug report: $e');
|
|
}
|
|
}
|
|
|
|
Future<List<String>> _collectLogs() async {
|
|
// جمعآوری لاگهای برنامه
|
|
return [];
|
|
}
|
|
|
|
Future<List<String>> _captureScreenshots() async {
|
|
// گرفتن عکسهای صفحه به صورت Base64
|
|
return [];
|
|
}
|
|
}
|
|
|
|
/// مثال استفاده:
|
|
|
|
void setupErrorHandling() {
|
|
final bugReportService = BugReportService(dio);
|
|
final errorHandler = AppErrorHandler(bugReportService, deviceInfoService);
|
|
|
|
FlutterError.onError = (FlutterErrorDetails details) {
|
|
errorHandler.handleError(
|
|
details,
|
|
userEmail: getCurrentUserEmail(),
|
|
accountId: getCurrentAccountId(),
|
|
bugTitle: 'خطای نامشخص',
|
|
bugType: 1, // Crash
|
|
bugPriority: 1, // Critical
|
|
);
|
|
};
|
|
|
|
PlatformDispatcher.instance.onError = (error, stack) {
|
|
errorHandler.handleError(
|
|
FlutterErrorDetails(
|
|
exception: error,
|
|
stack: stack,
|
|
context: ErrorDescription('Platform error'),
|
|
),
|
|
);
|
|
return true;
|
|
};
|
|
}
|
|
|