share_handler.dart 3.03 KB
import 'dart:io';

import 'package:appframe/config/locator.dart';
import 'package:appframe/services/dispatcher.dart';
import 'package:appframe/utils/image_util.dart';
import 'package:dio/dio.dart';
import 'package:fluwx/fluwx.dart';
import 'package:path/path.dart' as path;
import 'package:path_provider/path_provider.dart';

class ShareHandler extends MessageHandler {
  @override
  Future<bool> handleMessage(params) async {
    if (params is! Map<String, dynamic>) {
      throw Exception('参数错误');
    }

    var weapp = params['weapp'];
    if (weapp is! Map<String, dynamic>) {
      throw Exception('参数错误');
    }

    var title = weapp['title'] as String? ?? '';
    var imageUrl = weapp['imageUrl'] as String? ?? '';
    var path = weapp['path'] as String? ?? '';
    var appid = weapp['appid'] as String? ?? '';
    var desc = weapp['desc'] as String? ?? '';
    var envVersion = weapp['envVersion'] as String? ?? '';
    if (title.isEmpty || imageUrl.isEmpty || path.isEmpty || appid.isEmpty) {
      throw Exception('参数错误');
    }

    // 1 将图片下载到本机
    var imagePath = await _downloadToTemporaryDirectory(imageUrl);

    // 2 对图片生成缩略图
    // 微信官方要求小程序卡片缩略图数据不能大于 128K,否则分享失败,因此要生成缩略图处理
    var thumbPath = await ImageUtil.genTempThumbnail(imagePath, width: 640, quality: 14);

    // 3 读取缩略图为Uint8List
    var thumbData = await File(thumbPath!).readAsBytes();

    try {
      var model = WeChatShareMiniProgramModel(
        webPageUrl: imageUrl,
        miniProgramType: _getWXMiniProgramType(envVersion),
        userName: appid,
        path: path,
        title: title,
        description: desc,
        thumbData: thumbData,
      );
      Fluwx fluwx = getIt.get<Fluwx>();
      return await fluwx.share(model);
    } catch (e) {
      print(e);
      return false;
    }
  }

  WXMiniProgramType _getWXMiniProgramType(String? envVersion) {
    switch (envVersion) {
      case 'release':
        return WXMiniProgramType.release;
      case 'trial':
        return WXMiniProgramType.preview;
      case 'develop':
        return WXMiniProgramType.test;
      default:
        return WXMiniProgramType.preview;
    }
  }

  ///
  /// 将http资源下载到临时目录
  /// 返回下载后的路径
  ///
  Future<String> _downloadToTemporaryDirectory(String url) async {
    // 要保存的文件名和扩展名
    String saveFileName = path.basenameWithoutExtension(url);
    String ext = path.extension(url);
    // 临时目录
    var dir = await getTemporaryDirectory();
    // 要保存的路径
    var targetPath = path.join(dir.path, '$saveFileName.$ext');
    // 如果文件存在,则在文件名后添加数字
    int i = 1;
    while (File(targetPath).existsSync()) {
      targetPath = path.join(dir.path, '$saveFileName($i).$ext');
      i++;
    }

    final resp = await Dio().download(url, targetPath);
    if (resp.statusCode != 200) {
      throw Exception('文件下载失败');
    }

    return targetPath;
  }
}