flutter分享到微信、朋友圈、QQ好友、QQ空间、微博、钉钉封装工具类

import 'dart:async';
import 'dart:typed_data';

import 'package:generated/l10n.dart';
import 'package:jade/bean/ShareOutInfo.dart';
import 'package:jade/utils/Loading.dart';
import 'package:main.dart';
import 'package:util/easy_loading_util.dart';
import 'package:flu_dingtalk/flu_dingtalk.dart';
import 'package:fluwx/fluwx.dart';
import 'package:tencent_kit/tencent_kit.dart';
import 'package:weibo_kit/weibo_kit.dart';
import 'package:http/http.dart' as http;
import 'package:image/image.dart' as image;

class ShareUtil{

  /*
  * 微信、朋友圈分享
  * 引入库:fluwx: ^3.13.1
  * */
  shareWChat(ShareOutInfo shareOutInfo, WeChatScene scene, Function shareBack) async {
    await registerWxApi(appId: '微信appid', doOnIOS: false);

    var result = await isWeChatInstalled;
    if (result == false) {
      esLoadingError('请先下载安装微信');
      return;
    }
    // 微信分享
    bool _isShared = await shareToWeChat(WeChatShareWebPageModel(
        shareOutInfo.shareUrl,
        thumbnail: WeChatImage.network(shareOutInfo.thumbnail),
        scene: scene,
        //   scene: WeChatScene.SESSION,//会话
        //   scene: WeChatScene.TIMELINE,//朋友圈
        //   scene: WeChatScene.FAVORITE,//收藏
        title: shareOutInfo.title,
        description: shareOutInfo.subTitle));
    if(shareBack != null){
      if(_isShared == true){
        shareBack(true);
      }else{
        shareBack(false);
      }
    }
  }

  /*
  * QQ分享
  * sharePosition 0:QQ分享, 否则QQ空间分享 
  * 引入库:tencent_kit: ^3.1.0
  * */
  shareQQ(ShareOutInfo shareOutInfo, int sharePosition) async {
    await Tencent.instance.registerApp(appId: 'QQ appid');
    Tencent.instance.setIsPermissionGranted(granted: true);
    if (!await Tencent.instance.isQQInstalled()) {
      esLoadingToast(S.current.ninweianzhuangqq);
      return;
    }
    await Tencent.instance.shareWebpage(
        scene: sharePosition == 0 ? TencentScene.SCENE_QQ : TencentScene.SCENE_QZONE,
        //  scene: TencentScene.SCENE_QQ, //QQ会话
        //  scene: TencentScene.SCENE_QZONE, //QQ空间
        title: shareOutInfo.title,
        summary: shareOutInfo.subTitle,
        imageUri: Uri.parse(shareOutInfo.thumbnail),
        targetUrl: shareOutInfo.shareUrl);
  }

  /*
  * 微博分享
  * 引入库:weibo_kit: 3.1.0
  * 这个库限制图片大小不能大于1024 * 1024 * 0.5
  * */
  shareWeibo(ShareOutInfo shareOutInfo) async {
    await Weibo.instance.registerApp(
        appKey: '',
        universalLink: '',
        scope: [WeiboScope.ALL]);

    bool _isInstalled = await Weibo.instance.isInstalled();
    if(!_isInstalled){
      esLoadingToast('您可能未安装微博');
      return;
    }
    Loading.showLoadingText(navigatorKey.currentContext,title: '处理中...');
    Uint8List imageData =  await getImageBytesFromUrl(shareOutInfo.thumbnail,true);
    Loading.hideLoading(navigatorKey.currentContext);
    if(imageData!=null){
      await Weibo.instance.shareWebpage(
          title: shareOutInfo.title,
          description: shareOutInfo.subTitle,
          thumbData: imageData.buffer.asUint8List(),
          webpageUrl: shareOutInfo.shareUrl
      );
    }
  }


  /*
  * 从图片网络地址获取Uint8List数据
  * 引入库:http: 0.13.5
  * */
  Future<Uint8List> getImageBytesFromUrl(String url,bool toCompress) async {
    Completer<Uint8List> _completer = new Completer<Uint8List>();
    final response = await http.get(Uri.parse(url));
    if (response.statusCode == 200) {
      Uint8List _thumbData = Uint8List.fromList(response.bodyBytes);
      print('response.data= $_thumbData');
      if(toCompress){
        if (_thumbData.length > 1024 * 1024 * 0.5) {
          final image.Image thumbnail = image.decodeImage(_thumbData);
          int _quality = 90;
          print("图片初始大小:${_thumbData.length/ 1024 /1024}MB");
          while(_thumbData.length > 1024 * 1024 * 0.5 && _quality > 0){
            _thumbData = Uint8List.fromList(image.encodeJpg(thumbnail,quality: _quality));
            _quality -= 4;
          }
          print("图片压缩后大小:${_thumbData.length} ${_thumbData.length/ 1024 / 1024}MB");
        }
      }
      _completer.complete(_thumbData);
    } else {
      _completer.complete(null);
    }
    return _completer.future;
  }

   /*
  * 钉钉分享
  * 引入库:flu_dingtalk: 1.0.0+3
  * */
  shareDingTalk(ShareOutInfo shareOutInfo,Function shareBack) async {
    //注册钉钉插件
    // FlutterDingtalk.registerApp('钉钉appkey','com.test.pro');
    // FlutterDingtalk.registerApp('','com.youhengmedia.atui');
    try{
      bool _isSupport = await FluDingtalk.registerApp("钉钉appkey(ding开头的一串字符串)", "com.test.pro");
      if(_isSupport){
        bool isInstalled = await FluDingtalk.isDingDingInstalled();
        if(!isInstalled){
          esLoadingToast('您可能未安装钉钉');
          return;
        }
        bool _shared =  await FluDingtalk.sendWebPageMessage(
          shareOutInfo.shareUrl,
          title: shareOutInfo.title,
          content: shareOutInfo.subTitle,
          thumbUrl: shareOutInfo.thumbnail,
        );
        if(shareBack != null){
          shareBack(_shared);
        }
      }
    }catch(e){}
  }
}

配置分享信息的实体类

/*
* 微信、QQ等 分享出去的参数
* */
class ShareOutInfo{
   String shareUrl;//分享的链接
   String thumbnail;//分享的缩略图
   String title; //标题
   String subTitle;//副标题描述
   ShareOutInfo({
     this.shareUrl,
     this.thumbnail,
     this.title,
     this.subTitle
 });
 }

调用

_shareOutInfo = ShareOutInfo(
                shareUrl: _shareUrl,
                thumbnail: _thumbnailUrl,
                title: '标题',
                subTitle: '副标题'
            );
ShareUtil().shareWChat(_shareOutInfo,WeChatScene.SESSION,(value){});
  • 8
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要将Flutter中的图片保存到本地并分享QQ,你可以按照以下步骤操作: 1. 将图片保存到本地存储,可以使用以下代码: ```dart import 'dart:io'; import 'package:flutter/material.dart'; import 'package:path_provider/path_provider.dart'; import 'package:image_gallery_saver/image_gallery_saver.dart'; Future<void> saveImageToGallery(BuildContext context, String imageUrl) async { try { // 获取应用程序目录 Directory appDocDir = await getApplicationDocumentsDirectory(); // 获取文件名 String fileName = imageUrl.substring(imageUrl.lastIndexOf("/") + 1); // 组合路径 String filePath = "${appDocDir.path}/$fileName"; // 下载图片 HttpClient httpClient = HttpClient(); HttpClientRequest request = await httpClient.getUrl(Uri.parse(imageUrl)); HttpClientResponse response = await request.close(); Uint8List bytes = await consolidateHttpClientResponseBytes(response); // 保存图片到本地 File file = File(filePath); await file.writeAsBytes(bytes); // 保存图片到相册 await ImageGallerySaver.saveImage(bytes); ScaffoldMessenger.of(context).showSnackBar(SnackBar( content: Text("图片已保存到相册"), )); } catch (e) { ScaffoldMessenger.of(context).showSnackBar(SnackBar( content: Text("保存图片失败: $e"), )); } } ``` 2. 调用QQ分享功能,可以使用以下代码: ```dart import 'package:flutter/material.dart'; import 'package:flutter_qq_share/flutter_qq_share.dart'; Future<void> shareImageToQQ(BuildContext context, String imageUrl) async { try { // 获取应用程序目录 Directory appDocDir = await getApplicationDocumentsDirectory(); // 获取文件名 String fileName = imageUrl.substring(imageUrl.lastIndexOf("/") + 1); // 组合路径 String filePath = "${appDocDir.path}/$fileName"; // 下载图片 HttpClient httpClient = HttpClient(); HttpClientRequest request = await httpClient.getUrl(Uri.parse(imageUrl)); HttpClientResponse response = await request.close(); Uint8List bytes = await consolidateHttpClientResponseBytes(response); // 保存图片到本地 File file = File(filePath); await file.writeAsBytes(bytes); // 分享图片到QQ await FlutterQQShare.shareImageToQQ(filePath); } catch (e) { ScaffoldMessenger.of(context).showSnackBar(SnackBar( content: Text("分享图片失败: $e"), )); } } ``` 调用 `saveImageToGallery` 函数可以将图片保存到本地并保存到相册,调用 `shareImageToQQ` 函数可以将图片分享QQ。你可以根据自己的需求修改和调整这些代码。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值