feat(app): share redesign — card share (system), QR poster (banner+title+time+venue+QR, downloadable), copy link

- 三方式(用户需求):①卡片模式默认=系统分享面板(share_plus SharePlus.
  instance,微信/其他应用,文本=标题+链接)②生成二维码=海报弹层——顶部
  宣传图(banner→cover→品牌占位回退)+ 活动标题 + 时间 + 地址 + 二维码,
  「下载海报图」RepaintBoundary 3x 渲染 PNG → gal 存相册 ③复制链接
- 依赖 share_plus + gal;分享/保存均 Provider 注入(测试替身)
- 测试适配三方式结构 + 海报弹层断言(397/397 全绿、analyze 0)

Co-Authored-By: Claude Code <noreply@anthropic.com>
This commit is contained in:
浅念
2026-09-23 11:27:32 +08:00
parent 8768a04a75
commit df0c318599
9 changed files with 452 additions and 69 deletions
+14 -5
View File
@@ -63,16 +63,25 @@ void main() {
findsOneWidget,
reason: '开始时间(相册时区;结束未定不伪造区间)+ 场地(展示回退链)',
);
// 二维码真实生成 + 扫码说明 + 可选中链接。
expect(find.byType(QrImageView), findsOneWidget);
expect(find.text('Scan to view photos'), findsOneWidget);
// 测试环境 URL:默认 VIEWER_BASE + 正确 token + en 语言参数。
// UI06 三方式:系统分享(默认)/ 生成二维码海报 / 复制链接。
expect(find.text('Share to WeChat / other apps'), findsOneWidget);
expect(find.text('Generate QR poster'), findsOneWidget);
expect(find.text('Copy link'), findsOneWidget);
// 可选中链接(二维码与复制共用同一 URL)。
final url = 'http://10.0.2.2:5175/a/$token?lang=en';
expect(
tester.widget<SelectableText>(find.byType(SelectableText)).data,
url,
reason: '二维码与复制共用同一 URL(?lang= 随 App 语言)',
reason: '链接文本(?lang= 随 App 语言)',
);
// 点「生成二维码海报」→ 弹层:标题/时间/地址/二维码/下载按钮。
await tester.tap(find.text('Generate QR poster'));
await tester.pumpAndSettle();
expect(find.byType(QrImageView), findsOneWidget);
expect(find.text('Scan to view photos'), findsOneWidget);
expect(find.text('Download poster image'), findsOneWidget);
expect(find.text('2026/9/18 14:30'), findsOneWidget);
});
testWidgets('Copy link(主操作)→ 剪贴板收到带 lang 的 URL + 已复制提示',