wechat_share_util.dart 2.4 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980
  1. import 'package:flutter/cupertino.dart';
  2. import 'package:flutter/foundation.dart';
  3. import 'package:flutter/services.dart';
  4. import 'package:location/sdk/wechat/wechat_helper.dart';
  5. import 'package:wechat_kit/wechat_kit.dart';
  6. import '../../data/consts/web_url.dart';
  7. import '../../resource/assets.gen.dart';
  8. import '../../resource/string.gen.dart';
  9. import '../../utils/capture_util.dart';
  10. import 'package:image/image.dart' as img;
  11. class WechatShareUtil {
  12. WechatShareUtil._();
  13. static Future<void> shareWebPage() async {
  14. if (!await WechatHelper.isInstalled()) {
  15. throw Exception(StringName.wechatNoInstall);
  16. }
  17. return WechatHelper.shareUrlToWechat(
  18. scene: WechatScene.kSession,
  19. webpageUrl: WebUrl.shareUrl,
  20. title: StringName.shareFriendTitle,
  21. description: StringName.shareFriendDesc,
  22. thumbData: await assetImageToBytes(Assets.images.iconLogoMax.path));
  23. }
  24. static Future<Uint8List> assetImageToBytes(String assetPath) async {
  25. final ByteData byteData = await rootBundle.load(assetPath);
  26. return byteData.buffer.asUint8List();
  27. }
  28. static Future<void> shareWidgetToWeChat(
  29. GlobalKey repaintKey, {
  30. int scene = WechatScene.kSession,
  31. double pixelRatio = 2.5,
  32. int maxBytes = 1024 * 1024,
  33. }) async {
  34. try {
  35. final isInstall = await WechatHelper.isInstalled();
  36. if (!isInstall) {
  37. throw Exception(StringName.wechatNoInstall);
  38. }
  39. final captured = await CaptureUtil.captureWidgetToImage(repaintKey);
  40. if (captured == null) {
  41. throw Exception('截图失败');
  42. }
  43. final compressed =
  44. await _compressImageToLimit(captured, maxBytes: maxBytes);
  45. if (compressed == null) {
  46. debugPrint("图片压缩失败");
  47. return;
  48. }
  49. await WechatHelper.shareImageToWechat(
  50. scene: scene,
  51. imageData: compressed,
  52. );
  53. } catch (e) {
  54. throw Exception('分享失败');
  55. }
  56. }
  57. static Future<Uint8List?> _compressImageToLimit(Uint8List data,
  58. {required int maxBytes}) async {
  59. final decoded = img.decodeImage(data);
  60. if (decoded == null) return null;
  61. int quality = 95;
  62. late Uint8List result;
  63. do {
  64. result = Uint8List.fromList(img.encodeJpg(decoded, quality: quality));
  65. quality -= 5;
  66. } while (result.lengthInBytes > maxBytes && quality > 10);
  67. return result.lengthInBytes <= maxBytes ? result : null;
  68. }
  69. }