diff --git a/lib/modules/anime/anime_player_view.dart b/lib/modules/anime/anime_player_view.dart index 330a1955..7500b533 100644 --- a/lib/modules/anime/anime_player_view.dart +++ b/lib/modules/anime/anime_player_view.dart @@ -2255,13 +2255,22 @@ mp.register_script_message('call_button_${button.id}_long', button${button.id}lo format: "image/png", includeLibassSubtitles: _includeSubtitles, ); - await Share.shareXFiles([ - XFile.fromData( - imageBytes!, - name: name, - mimeType: 'image/png', - ), - ]); + if (context.mounted) { + final box = + context.findRenderObject() as RenderBox?; + await Share.shareXFiles( + [ + XFile.fromData( + imageBytes!, + name: name, + mimeType: 'image/png', + ), + ], + sharePositionOrigin: + box!.localToGlobal(Offset.zero) & + box.size, + ); + } }, ), button( diff --git a/lib/modules/manga/detail/manga_detail_view.dart b/lib/modules/manga/detail/manga_detail_view.dart index 8716e982..f2dbd575 100644 --- a/lib/modules/manga/detail/manga_detail_view.dart +++ b/lib/modules/manga/detail/manga_detail_view.dart @@ -654,7 +654,14 @@ class _MangaDetailViewState extends ConsumerState ); final url = "${source!.baseUrl}${widget.manga!.link!.getUrlWithoutDomain}"; - Share.share(url); + final box = + context.findRenderObject() as RenderBox?; + Share.share( + url, + sharePositionOrigin: + box!.localToGlobal(Offset.zero) & + box.size, + ); break; case 3: context.push("/migrate", extra: widget.manga); diff --git a/lib/modules/manga/download/download_page_widget.dart b/lib/modules/manga/download/download_page_widget.dart index 312e61a3..c0b46a2c 100644 --- a/lib/modules/manga/download/download_page_widget.dart +++ b/lib/modules/manga/download/download_page_widget.dart @@ -25,7 +25,7 @@ class ChapterPageDownload extends ConsumerWidget { ref.read(downloadChapterProvider(chapter: chapter, useWifi: useWifi)); } - void _sendFile() async { + void _sendFile(BuildContext context) async { final storageProvider = StorageProvider(); final mangaDir = await storageProvider.getMangaMainDirectory(chapter); final path = await storageProvider.getMangaChapterDirectory( @@ -52,8 +52,13 @@ class ChapterPageDownload extends ConsumerWidget { } else { files = path!.listSync().map((e) => XFile(e.path)).toList(); } - if (files.isNotEmpty) { - Share.shareXFiles(files, text: chapter.name); + if (files.isNotEmpty && context.mounted) { + final box = context.findRenderObject() as RenderBox?; + Share.shareXFiles( + files, + text: chapter.name, + sharePositionOrigin: box!.localToGlobal(Offset.zero) & box.size, + ); } } @@ -123,7 +128,7 @@ class ChapterPageDownload extends ConsumerWidget { ), onSelected: (value) { if (value == 0) { - _sendFile(); + _sendFile(context); } else if (value == 1) { _deleteFile(download.id!); } diff --git a/lib/modules/manga/reader/reader_view.dart b/lib/modules/manga/reader/reader_view.dart index 367e8874..4fb4472c 100644 --- a/lib/modules/manga/reader/reader_view.dart +++ b/lib/modules/manga/reader/reader_view.dart @@ -401,13 +401,21 @@ class _MangaChapterPageGalleryState context.l10n.share, Icons.share_outlined, () async { - await Share.shareXFiles([ - XFile.fromData( - imageBytes, - name: name, - mimeType: 'image/png', - ), - ]); + if (context.mounted) { + final box = + context.findRenderObject() as RenderBox?; + await Share.shareXFiles( + [ + XFile.fromData( + imageBytes, + name: name, + mimeType: 'image/png', + ), + ], + sharePositionOrigin: + box!.localToGlobal(Offset.zero) & box.size, + ); + } }, ), button( diff --git a/lib/modules/more/about/about_screen.dart b/lib/modules/more/about/about_screen.dart index 07973052..098e3cbd 100644 --- a/lib/modules/more/about/about_screen.dart +++ b/lib/modules/more/about/about_screen.dart @@ -93,9 +93,16 @@ class AboutScreen extends ConsumerWidget { ClipboardData(text: file.path), ); } - Share.shareXFiles([ - XFile(file.path), - ], text: "log.txt"); + if (context.mounted) { + final box = + context.findRenderObject() as RenderBox?; + Share.shareXFiles( + [XFile(file.path)], + text: "log.txt", + sharePositionOrigin: + box!.localToGlobal(Offset.zero) & box.size, + ); + } } else { botToast(l10n.no_app_logs); } diff --git a/lib/modules/more/data_and_storage/providers/backup.dart b/lib/modules/more/data_and_storage/providers/backup.dart index 296b474d..eb312edd 100644 --- a/lib/modules/more/data_and_storage/providers/backup.dart +++ b/lib/modules/more/data_and_storage/providers/backup.dart @@ -176,9 +176,13 @@ Future doBackUp( alignment: Alignment.topLeft, child: ElevatedButton( onPressed: () { - Share.shareXFiles([ - XFile(p.join(path, "$name.backup")), - ], text: "$name.backup"); + final box = context.findRenderObject() as RenderBox?; + Share.shareXFiles( + [XFile(p.join(path, "$name.backup"))], + text: "$name.backup", + sharePositionOrigin: + box!.localToGlobal(Offset.zero) & box.size, + ); }, child: Text(context.l10n.share), ), diff --git a/lib/modules/webview/webview.dart b/lib/modules/webview/webview.dart index 5f6bb8f8..b5968977 100644 --- a/lib/modules/webview/webview.dart +++ b/lib/modules/webview/webview.dart @@ -239,7 +239,14 @@ class _MangaWebViewState extends ConsumerState { if (value == 0) { _webViewController?.reload(); } else if (value == 1) { - Share.share(_url); + final box = + context.findRenderObject() as RenderBox?; + Share.share( + _url, + sharePositionOrigin: + box!.localToGlobal(Offset.zero) & + box.size, + ); } else if (value == 2) { await InAppBrowser.openWithSystemBrowser( url: WebUri(_url),