Flutter应用开发:滚动截图+微信分享

8,578 阅读1分钟

微信分享.webp

背景

应用上线一段时间后,在客户交流使用过程中发现,客户会频繁截图分享订单详情页面到微信群中和管理员、付款方核对订单支付状态、金额等信息。而截图只能截一屏,多频率会截取两张图才能完全表达清楚信息。本着方便他人即利己的原则,一键滚动截图分享上线。

xx.jpg

滚动截图

标记滚动区域

首先找到滚动区域(滚动区域为上图截图区域),包裹于RepaintBoundary小部件(Widget),设置GlobalKey表一标记。

image.png

final GlobalKey _screenshotKey = GlobalKey();
 
RepaintBoundary(
      key: _screenshotKey,
      child:Text('滚动区域') // 包含截图的所有内容
 )

截屏图片生成图片流ByteData

  Future<ByteData?> _capturePngToByteData() async {
    try {
      RenderRepaintBoundary boundary = _screenshotKey.currentContext!.findRenderObject() as RenderRepaintBoundary;
      double dpr = ui.window.devicePixelRatio; // 获取当前设备的像素比
      ui.Image image = await boundary.toImage(pixelRatio: dpr);
      ByteData? _byteData = await image.toByteData(format: ui.ImageByteFormat.png);
      return _byteData;
    } catch (e) {
      print(e);
    }
    return null;
  }

图片ByteData写入File

    ByteData? sourceByteData = await _capturePngToByteData();
    Uint8List sourceBytes = sourceByteData!.buffer.asUint8List();

    Directory tempDir = await getTemporaryDirectory();

    String storagePath = tempDir.path;
    File file = new File('$storagePath/order_detail.jpg');

    if (!file.existsSync()) {
      file.createSync();
    }
    file.writeAsBytesSync(sourceBytes);

微信分享

开始引入fluwx作为微信分享插件,结果fluwx和之前引入的wechat_kit插件在启动上有冲突,即使剔除webchat_kit引入,清理掉flutter缓存及Android缓存也无法规避冲突。尝试如下:

// 1.清理flutter引入包缓存

// 把activity-alias干掉了  
flutter clean  
flutter pub get  
flutter run

// 2.清理Android缓存

// 在android目录下执行
./gradlew.bat clean

始终无法规避activity-alias中:wechat_kit冲突,可能因为不熟悉flutter和Android原生交互所致,错误日志如下:

image.png

09E2F80A.png

在经过几天尝试后还是无法正常应用,于是放弃,引入了share_plus插件。

分享目标端支持很丰富,完全满足需求,能更精细的分享到微信朋友圈、微信群聊、微信朋友、微信收藏。分享逻辑很简洁,也没关注微信appId,对我这种不熟悉flutter和Android原生交互的小白来说如同久旱逢甘露。

flutter pub get share_plus
import 'package:share_plus/share_plus.dart';
  // 接上面滚动生成的文件,直接调用分享即可
    try {
      Share.shareFiles(['$storagePath/order_detail.jpg'], text: '订单详情', subject: '${_item.orderNo}');
    } on PlatformException catch (e) {
      // 捕获并处理平台异常
      ScaffoldMessenger.of(context).showSnackBar(
        SnackBar(content: Text('分享时发生错误:${e.message}')),
      );
    }

插件会根据手机上安装的APP,展示出所有可用于分享的目标端。

8%P8Y$LQ61O63%24W8TLFVR.jpg

后记

其实在做分享功能之前,做了充分调研,对Flutter分享相关插件应用文档认真研读。选了一个推荐指数比较高且有开发群交流跟踪的fluwx,边开发边咨询,然而遇到要真正落地项目中时却举步维艰。稍微变更一个插件却峰回路转、柳暗花明。对于开发人员来说术业有专攻,在自己不擅长的领域死磕并没有预想的解决问题,反而让自己陷入困苦中。