From 3d86afa59261ceecf74da36f185acca1921922b9 Mon Sep 17 00:00:00 2001 From: RafayAhmad7548 Date: Mon, 28 Jul 2025 08:24:22 +0500 Subject: [PATCH] error handling with nice snackbar on fabs --- lib/sftp_explorer.dart | 68 ++++++++++++++++++++++++++---------------- 1 file changed, 42 insertions(+), 26 deletions(-) diff --git a/lib/sftp_explorer.dart b/lib/sftp_explorer.dart index 4b8e966..daaa1a3 100644 --- a/lib/sftp_explorer.dart +++ b/lib/sftp_explorer.dart @@ -157,23 +157,13 @@ class _SftpExplorerState extends State { await widget.sftpClient.mkdir('${widget.path}${nameController.text}'); _listDir(); } - on SftpStatusError catch (e) { + on SftpStatusError catch (e) { if (context.mounted) { if (e.code == 4) { - ScaffoldMessenger.of(context).showSnackBar( - SnackBar( - behavior: SnackBarBehavior.floating, - content: Text('Folder Already Exists') - ) - ); + ScaffoldMessenger.of(context).showSnackBar(_buildErrorSnackBar(context, 'Folder Already Exists')); } else { - ScaffoldMessenger.of(context).showSnackBar( - SnackBar( - behavior: SnackBarBehavior.floating, - content: Text('Error: ${e.message}') - ) - ); + ScaffoldMessenger.of(context).showSnackBar(_buildErrorSnackBar(context, 'Error: ${e.message}')); } } } @@ -194,20 +184,32 @@ class _SftpExplorerState extends State { onPressed: () async { final List files = await openFiles(); for (XFile file in files) { - final remoteFile = await widget.sftpClient.open('${widget.path}${file.name}', mode: SftpFileOpenMode.create | SftpFileOpenMode.write | SftpFileOpenMode.exclusive); - final fileSize = await file.length(); - final uploader = remoteFile.write( - file.openRead().cast(), - onProgress: (progress) => setState(() => _progress = progress/fileSize) - ); - setState(() { - _loader = uploader; - _loadingFileName = file.name; - }); - await uploader.done; + try { + final remoteFile = await widget.sftpClient.open('${widget.path}${file.name}', mode: SftpFileOpenMode.create | SftpFileOpenMode.write | SftpFileOpenMode.exclusive); + final fileSize = await file.length(); + final uploader = remoteFile.write( + file.openRead().cast(), + onProgress: (progress) => setState(() => _progress = progress/fileSize) + ); + setState(() { + _loader = uploader; + _loadingFileName = file.name; + }); + await uploader.done; + setState(() => _loader = null); + _listDir(); + } + on SftpStatusError catch (e) { + if (context.mounted) { + if (e.code == 4) { + ScaffoldMessenger.of(context).showSnackBar(_buildErrorSnackBar(context, 'File Already Exists')); + } + else { + ScaffoldMessenger.of(context).showSnackBar(_buildErrorSnackBar(context, 'Error: ${e.message}')); + } + } + } } - setState(() => _loader = null); - _listDir(); }, child: Icon(Icons.upload), ), @@ -215,6 +217,20 @@ class _SftpExplorerState extends State { ); } + SnackBar _buildErrorSnackBar(BuildContext context, String error) { + return SnackBar( + backgroundColor: Theme.of(context).colorScheme.secondaryContainer, + behavior: SnackBarBehavior.floating, + content: Row( + spacing: 10, + children: [ + Icon(Icons.error, color: Colors.red,), + Text(error, style: TextStyle(color: Theme.of(context).colorScheme.onSecondaryContainer),), + ], + ) + ); + } + Widget _buildLoadingWidget(BuildContext context) { return _loader != null ? Container( color: Theme.of(context).colorScheme.secondaryContainer,