背景
应用上线一段时间后,在客户交流使用过程中发现,客户会频繁截图分享订单详情页面到微信群中和管理员、付款方核对订单支付状态、金额等信息。而截图只能截一屏,多频率会截取两张图才能完全表达清楚信息。本着方便他人即利己的原则,一键滚动截图分享上线。
滚动截图
标记滚动区域
首先找到滚动区域(滚动区域为上图截图区域),包裹于RepaintBoundary
小部件(Widget),设置GlobalKey
表一标记。
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原生交互所致,错误日志如下:
在经过几天尝试后还是无法正常应用,于是放弃,引入了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,展示出所有可用于分享的目标端。
后记
其实在做分享功能之前,做了充分调研,对Flutter分享相关插件应用文档认真研读。选了一个推荐指数比较高且有开发群交流跟踪的fluwx,边开发边咨询,然而遇到要真正落地项目中时却举步维艰。稍微变更一个插件却峰回路转、柳暗花明。对于开发人员来说术业有专攻,在自己不擅长的领域死磕并没有预想的解决问题,反而让自己陷入困苦中。