submit method
- FeedbackEntry entry
override
Sends entry to the backend.
Throw any Exception on failure. QueuedBackend intercepts backend exceptions and enqueues the entry for retry.
Implementation
@override
Future<void> submit(FeedbackEntry entry) async {
assert(kDebugMode, 'LocalFeedbackBackend must only be used in debug mode');
await directory.create(recursive: true);
// e.g. 2026-03-31T14-30-00-000_bug
final ts = entry.createdAt
.toIso8601String()
.replaceAll(':', '-')
.replaceAll('.', '-');
final id = '${ts}_${entry.category}';
// Save each screenshot as a PNG file
final screenshotFileNames = <String>[];
for (var i = 0; i < entry.screenshots.length; i++) {
final name = '${id}_ss${i + 1}.png';
await File('${directory.path}/$name')
.writeAsBytes(base64Decode(entry.screenshots[i]));
screenshotFileNames.add(name);
}
// Save JSON (filenames, not base64 blobs)
final json = <String, dynamic>{
'category': entry.category,
'message': entry.message,
'platform': entry.platform,
'appVersion': entry.appVersion,
'createdAt': entry.createdAt.toIso8601String(),
'screenshots': screenshotFileNames,
};
await File('${directory.path}/$id.json')
.writeAsString(const JsonEncoder.withIndent(' ').convert(json));
debugPrint(
'[FeedbackKit] 📋 $id.json | '
'${entry.category} | '
'${entry.screenshots.length} screenshot(s)',
);
}