diff --git a/lib/common/widgets/interactiveviewer_gallery/interactiveviewer_gallery.dart b/lib/common/widgets/interactiveviewer_gallery/interactiveviewer_gallery.dart index 69c93790..399bc4ba 100644 --- a/lib/common/widgets/interactiveviewer_gallery/interactiveviewer_gallery.dart +++ b/lib/common/widgets/interactiveviewer_gallery/interactiveviewer_gallery.dart @@ -437,16 +437,30 @@ class _InteractiveviewerGalleryState extends State // 图片分享 void onShareImg(String imgUrl) async { - SmartDialog.showLoading(); - var response = await Request() - .get(imgUrl, options: Options(responseType: ResponseType.bytes)); - final temp = await getTemporaryDirectory(); - SmartDialog.dismiss(); - String imgName = - "plpl_pic_${DateTime.now().toString().split('-').join()}.jpg"; - var path = '${temp.path}/$imgName'; - File(path).writeAsBytesSync(response.data); - Share.shareXFiles([XFile(path)], subject: imgUrl); + try { + SmartDialog.showLoading(); + var response = await Request() + .get(imgUrl, options: Options(responseType: ResponseType.bytes)); + final temp = await getTemporaryDirectory(); + SmartDialog.dismiss(); + String imgName = + "plpl_pic_${DateTime.now().toString().split('-').join()}.jpg"; + var path = '${temp.path}/$imgName'; + File(path).writeAsBytesSync(response.data); + + Rect? sharePositionOrigin; + if (Platform.isIOS && (await Utils.isIpad())) { + sharePositionOrigin = Rect.fromLTWH(0, 0, Get.width, Get.height / 2); + } + + Share.shareXFiles( + [XFile(path)], + subject: imgUrl, + sharePositionOrigin: sharePositionOrigin, + ); + } catch (e) { + SmartDialog.showToast(e.toString()); + } } Widget _itemBuilder(index) { diff --git a/lib/pages/bangumi/introduction/controller.dart b/lib/pages/bangumi/introduction/controller.dart index ac36d85a..125e9001 100644 --- a/lib/pages/bangumi/introduction/controller.dart +++ b/lib/pages/bangumi/introduction/controller.dart @@ -23,7 +23,6 @@ import 'package:PiliPlus/pages/video/detail/reply/index.dart'; import 'package:PiliPlus/plugin/pl_player/models/play_repeat.dart'; import 'package:PiliPlus/utils/feed_back.dart'; import 'package:PiliPlus/utils/storage.dart'; -import 'package:share_plus/share_plus.dart'; import 'package:html/parser.dart' as html_parser; import 'package:html/dom.dart' as dom; @@ -396,7 +395,7 @@ class BangumiIntroController extends CommonController { ), onTap: () { Get.back(); - Share.share(videoUrl); + Utils.shareText(videoUrl); }, ), ListTile( diff --git a/lib/pages/dynamics/detail/view.dart b/lib/pages/dynamics/detail/view.dart index 0cc8ed96..9b96116f 100644 --- a/lib/pages/dynamics/detail/view.dart +++ b/lib/pages/dynamics/detail/view.dart @@ -27,7 +27,6 @@ import 'package:PiliPlus/pages/dynamics/detail/index.dart'; import 'package:PiliPlus/pages/dynamics/widgets/author_panel.dart'; import 'package:PiliPlus/pages/video/detail/reply_reply/index.dart'; import 'package:PiliPlus/utils/feed_back.dart'; -import 'package:share_plus/share_plus.dart'; import '../../../utils/grid.dart'; import '../widgets/dynamic_panel.dart'; @@ -555,7 +554,7 @@ class _DynamicDetailPageState extends State Expanded( child: TextButton.icon( onPressed: () { - Share.share( + Utils.shareText( '${HttpString.dynamicShareBaseUrl}/${_dynamicDetailController.item.idStr}'); }, icon: Icon( diff --git a/lib/pages/dynamics/widgets/author_panel.dart b/lib/pages/dynamics/widgets/author_panel.dart index 5989b50d..abfca822 100644 --- a/lib/pages/dynamics/widgets/author_panel.dart +++ b/lib/pages/dynamics/widgets/author_panel.dart @@ -12,7 +12,6 @@ import 'package:PiliPlus/common/widgets/network_img_layer.dart'; import 'package:PiliPlus/http/user.dart'; import 'package:PiliPlus/utils/feed_back.dart'; import 'package:PiliPlus/utils/utils.dart'; -import 'package:share_plus/share_plus.dart'; import '../../../http/constants.dart'; import '../controller.dart'; @@ -290,7 +289,8 @@ class AuthorPanel extends StatelessWidget { leading: const Icon(Icons.share_outlined, size: 19), onTap: () { Get.back(); - Share.share('${HttpString.dynamicShareBaseUrl}/${item.idStr}'); + Utils.shareText( + '${HttpString.dynamicShareBaseUrl}/${item.idStr}'); }, minLeadingWidth: 0, ), diff --git a/lib/pages/dynamics/widgets/author_panel_grpc.dart b/lib/pages/dynamics/widgets/author_panel_grpc.dart index 2b589930..5a4b39d6 100644 --- a/lib/pages/dynamics/widgets/author_panel_grpc.dart +++ b/lib/pages/dynamics/widgets/author_panel_grpc.dart @@ -8,7 +8,6 @@ import 'package:PiliPlus/common/widgets/network_img_layer.dart'; import 'package:PiliPlus/http/user.dart'; import 'package:PiliPlus/utils/feed_back.dart'; import 'package:PiliPlus/utils/utils.dart'; -import 'package:share_plus/share_plus.dart'; import '../../../http/constants.dart'; import '../controller.dart'; @@ -213,7 +212,8 @@ class MorePanel extends StatelessWidget { leading: const Icon(Icons.share_outlined, size: 19), onTap: () { Get.back(); - Share.share('${HttpString.dynamicShareBaseUrl}/${item.idStr}'); + Utils.shareText( + '${HttpString.dynamicShareBaseUrl}/${item.idStr}'); }, minLeadingWidth: 0, ), diff --git a/lib/pages/html/view.dart b/lib/pages/html/view.dart index d1c1df25..70630bfc 100644 --- a/lib/pages/html/view.dart +++ b/lib/pages/html/view.dart @@ -24,7 +24,6 @@ import 'package:PiliPlus/common/widgets/network_img_layer.dart'; import 'package:PiliPlus/models/common/reply_type.dart'; import 'package:PiliPlus/pages/video/detail/reply_reply/index.dart'; import 'package:PiliPlus/utils/feed_back.dart'; -import 'package:share_plus/share_plus.dart'; import '../../utils/grid.dart'; import 'controller.dart'; @@ -312,7 +311,7 @@ class _HtmlRenderPageState extends State ), ), PopupMenuItem( - onTap: () => Share.share(url), + onTap: () => Utils.shareText(url), child: const Row( mainAxisSize: MainAxisSize.min, children: [ @@ -558,7 +557,7 @@ class _HtmlRenderPageState extends State Expanded( child: TextButton.icon( onPressed: () { - Share.share( + Utils.shareText( '${HttpString.dynamicShareBaseUrl}/${_htmlRenderCtr.item.value.idStr}'); }, icon: Icon( diff --git a/lib/pages/member/controller.dart b/lib/pages/member/controller.dart index 1c2ab3c4..4d21927c 100644 --- a/lib/pages/member/controller.dart +++ b/lib/pages/member/controller.dart @@ -9,7 +9,6 @@ import 'package:PiliPlus/models/member/archive.dart'; import 'package:PiliPlus/models/member/coin.dart'; import 'package:PiliPlus/models/member/info.dart'; import 'package:PiliPlus/utils/storage.dart'; -import 'package:share_plus/share_plus.dart'; import '../video/detail/introduction/widgets/group_panel.dart'; @@ -240,7 +239,8 @@ class MemberController extends GetxController { } void shareUser() { - Share.share('${memberInfo.value.name} - https://space.bilibili.com/$mid'); + Utils.shareText( + '${memberInfo.value.name} - https://space.bilibili.com/$mid'); } // 请求专栏 diff --git a/lib/pages/member/new/controller.dart b/lib/pages/member/new/controller.dart index 45574412..98b1cf84 100644 --- a/lib/pages/member/new/controller.dart +++ b/lib/pages/member/new/controller.dart @@ -12,7 +12,6 @@ import 'package:flutter/material.dart'; import 'package:flutter_smart_dialog/flutter_smart_dialog.dart'; import 'package:get/get.dart'; import 'package:intl/intl.dart'; -import 'package:share_plus/share_plus.dart'; enum MemberTabType { none, home, dynamic, contribute, favorite, bangumi } @@ -149,7 +148,7 @@ class MemberControllerNew extends CommonController } void shareUser() { - Share.share('https://space.bilibili.com/$mid'); + Utils.shareText('https://space.bilibili.com/$mid'); } void _onBlock() async { diff --git a/lib/pages/video/detail/introduction/controller.dart b/lib/pages/video/detail/introduction/controller.dart index 7229b065..d1a81590 100644 --- a/lib/pages/video/detail/introduction/controller.dart +++ b/lib/pages/video/detail/introduction/controller.dart @@ -23,7 +23,6 @@ import 'package:PiliPlus/plugin/pl_player/models/play_repeat.dart'; import 'package:PiliPlus/utils/feed_back.dart'; import 'package:PiliPlus/utils/id_utils.dart'; import 'package:PiliPlus/utils/storage.dart'; -import 'package:share_plus/share_plus.dart'; import '../../../../http/search.dart'; import '../../../../models/model_hot_video_item.dart'; @@ -498,7 +497,7 @@ class VideoIntroController extends GetxController ), onTap: () { Get.back(); - Share.share('${videoDetail.value.title} ' + Utils.shareText('${videoDetail.value.title} ' 'UP主: ${videoDetail.value.owner!.name!}' ' - $videoUrl'); }, diff --git a/lib/utils/utils.dart b/lib/utils/utils.dart index 711166ed..50f8f56f 100644 --- a/lib/utils/utils.dart +++ b/lib/utils/utils.dart @@ -38,6 +38,7 @@ import 'package:flutter_smart_dialog/flutter_smart_dialog.dart'; import 'package:get/get.dart'; import 'package:get/get_navigation/src/dialog/dialog_route.dart'; import 'package:path_provider/path_provider.dart'; +import 'package:share_plus/share_plus.dart'; import 'package:url_launcher/url_launcher.dart'; import 'package:html/dom.dart' as dom; import 'package:html/parser.dart' as html_parser; @@ -48,6 +49,33 @@ class Utils { static const channel = MethodChannel("PiliPlus"); + static bool? _isIpad; + + static Future isIpad() async { + if (_isIpad != null) { + return _isIpad!; + } + DeviceInfoPlugin deviceInfo = DeviceInfoPlugin(); + IosDeviceInfo info = await deviceInfo.iosInfo; + _isIpad = info.model.toLowerCase().contains("ipad"); + return _isIpad!; + } + + static void shareText(String text) async { + try { + Rect? sharePositionOrigin; + if (Platform.isIOS && (await isIpad())) { + sharePositionOrigin = Rect.fromLTWH(0, 0, Get.width, Get.height / 2); + } + Share.share( + text, + sharePositionOrigin: sharePositionOrigin, + ); + } catch (e) { + SmartDialog.showToast(e.toString()); + } + } + static void toViewPage( String page, { dynamic arguments,