saveFileNative method
Implementation
Future<String?> saveFileNative(
Uint8List bytes,
String defaultName,
String extension,
) async {
if (kIsWeb) {
downloadFileWeb(bytes, '$defaultName.$extension');
return null;
}
if (Platform.isAndroid || Platform.isIOS) {
try {
final result = await FilePicker.platform.saveFile(
dialogTitle: 'Save file',
fileName: defaultName,
type: FileType.custom,
allowedExtensions: [extension],
bytes: bytes, // Required on Android/iOS
);
if (result != null) {
return result;
}
} catch (e) {}
return null;
}
if (Platform.isLinux) {
try {
final result = await Process.run('zenity', [
'--file-selection',
'--save',
'--confirm-overwrite',
'--filename=$defaultName',
'--file-filter=*.$extension',
'--title=Save file',
]);
if (result.exitCode == 0) {
var path = (result.stdout as String).trim();
if (path.isNotEmpty) {
if (!path.endsWith('.$extension')) path += '.$extension';
final file = File(path);
await file.writeAsBytes(bytes);
return path;
}
}
} catch (_) {}
try {
final result = await Process.run('kdialog', [
'--getsavefilename',
defaultName,
'*.$extension',
]);
if (result.exitCode == 0) {
var path = (result.stdout as String).trim();
if (path.isNotEmpty) {
if (!path.endsWith('.$extension')) path += '.$extension';
final file = File(path);
await file.writeAsBytes(bytes);
return path;
}
}
} catch (_) {}
// Fallback: file_selector (GTK dialog on Linux)
try {
final location = await getSaveLocation(suggestedName: defaultName);
if (location != null) {
var path = location.path;
if (!path.endsWith('.$extension')) path += '.$extension';
final file = File(path);
await file.writeAsBytes(bytes);
return path;
}
} catch (_) {}
} else if (Platform.isMacOS || Platform.isWindows) {
try {
final location = await getSaveLocation(suggestedName: defaultName);
if (location != null) {
var path = location.path;
if (!path.endsWith('.$extension')) path += '.$extension';
final file = File(path);
await file.writeAsBytes(bytes);
return path;
}
} catch (_) {}
}
return null;
}