diff --git a/lib/providers/content/attachment.dart b/lib/providers/content/attachment.dart index c972f41..8164c8a 100644 --- a/lib/providers/content/attachment.dart +++ b/lib/providers/content/attachment.dart @@ -82,7 +82,7 @@ class AttachmentProvider extends GetConnect { }), ); if (resp.statusCode != 200) { - throw Exception(resp.bodyString); + throw Exception('${resp.statusCode}: ${resp.bodyString}'); } return resp; diff --git a/lib/translations.dart b/lib/translations.dart index 227f9ab..f978ea2 100644 --- a/lib/translations.dart +++ b/lib/translations.dart @@ -99,6 +99,9 @@ class SolianMessages extends Translations { 'attachmentAddFile': 'Attach file', 'attachmentSetting': 'Adjust attachment', 'attachmentAlt': 'Alternative text', + 'attachmentLoadFailed': 'Load Attachment Failed', + 'attachmentLoadFailedCaption': + 'Something went wrong during loading the attachment metadata...', 'realm': 'Realm', 'realms': 'Realms', 'realmOrganizing': 'Organize a realm', @@ -274,6 +277,8 @@ class SolianMessages extends Translations { 'attachmentAddFile': '附加文件', 'attachmentSetting': '调整附件', 'attachmentAlt': '替代文字', + 'attachmentLoadFailed': '加载失败', + 'attachmentLoadFailedCaption': '有错误发生于加载附件元数据的过程中了…', 'realm': '领域', 'realms': '领域', 'realmOrganizing': '组织领域', diff --git a/lib/widgets/attachments/attachment_list.dart b/lib/widgets/attachments/attachment_list.dart index 6dbfeea..002a4d5 100644 --- a/lib/widgets/attachments/attachment_list.dart +++ b/lib/widgets/attachments/attachment_list.dart @@ -40,12 +40,15 @@ class _AttachmentListState extends State { for (var idx = 0; idx < widget.attachmentsId.length; idx++) { provider.getMetadata(widget.attachmentsId[idx]).then((resp) { progress++; - _attachmentsMeta[idx] = Attachment.fromJson(resp.body); + if (resp.body != null) { + _attachmentsMeta[idx] = Attachment.fromJson(resp.body); + } if (progress == widget.attachmentsId.length) { - setState(() { - calculateAspectRatio(); - _isLoading = false; - }); + calculateAspectRatio(); + + if (mounted) { + setState(() => _isLoading = false); + } } }); } @@ -118,6 +121,31 @@ class _AttachmentListState extends State { itemCount: _attachmentsMeta.length, itemBuilder: (context, idx, _) { final element = _attachmentsMeta[idx]; + + if (element == null) { + return Center( + child: Container( + constraints: const BoxConstraints(maxWidth: 280), + child: Column( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + const Icon(Icons.close, size: 32), + const SizedBox(height: 8), + Text( + 'attachmentLoadFailed'.tr, + style: const TextStyle( + fontWeight: FontWeight.bold, fontSize: 16), + ), + Text( + 'attachmentLoadFailedCaption'.tr, + textAlign: TextAlign.center, + ), + ], + ), + ), + ); + } + return GestureDetector( child: Container( width: MediaQuery.of(context).size.width, @@ -129,7 +157,7 @@ class _AttachmentListState extends State { children: [ AttachmentItem( parentId: widget.parentId, - key: Key('a${element!.uuid}'), + key: Key('a${element.uuid}'), item: element, badge: _attachmentsMeta.length > 1 ? '${idx + 1}/${_attachmentsMeta.length}' diff --git a/lib/widgets/attachments/attachment_publish.dart b/lib/widgets/attachments/attachment_publish.dart index c2a5cb2..8ae5a51 100644 --- a/lib/widgets/attachments/attachment_publish.dart +++ b/lib/widgets/attachments/attachment_publish.dart @@ -154,7 +154,7 @@ class _AttachmentPublishingPopupState extends State { var result = Attachment.fromJson(resp.body); setState(() => _attachments.add(result)); widget.onUpdate(_attachments.map((e) => e!.id).toList()); - } catch (e) { + } catch (err) { rethrow; } } @@ -239,7 +239,8 @@ class _AttachmentPublishingPopupState extends State { itemCount: _attachments.length, itemBuilder: (context, index) { final element = _attachments[index]; - final fileType = element!.mimetype.split('/').first; + var fileType = element!.mimetype.split('/').firstOrNull; + fileType ??= 'unknown'; return Container( padding: const EdgeInsets.only(left: 16, right: 8, bottom: 16),