@ -18,6 +18,27 @@ import '../../controllers/meeting_details_controller.dart';
import ' ../../controllers/mind_map_controller.dart ' ;
import ' second_level_bottom_sheet.dart ' ;
/ / / = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = =
/ / / 分 享 底 部 弹 窗 组 件
/ / / = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = =
/ / / 功 能 说 明 :
/ / / 本 组 件 提 供 会 议 详 情 页 面 的 分 享 功 能 入 口 , 以 底 部 弹 窗 形 式 展 示 8 个 核 心 功 能 :
/ / / 1. 分 享 链 接 - 生 成 并 分 享 会 议 网 页 链 接
/ / / 2. 复 制 转 写 - 将 会 议 转 写 文 本 复 制 到 剪 贴 板
/ / / 3. 复 制 总 结 - 将 会 议 总 结 内 容 复 制 到 剪 贴 板
/ / / 4. 导 出 音 频 - 分 享 会 议 录 音 文 件
/ / / 5. 导 出 转 写 - 将 转 写 内 容 导 出 为 TXT文件
/ / / 6. 导 出 总 结 - 将 总 结 内 容 导 出 为 TXT或PDF文件
/ / / 7. 保 存 思 维 导 图 - 将 思 维 导 图 保 存 为 图 片 到 本 地
/ / / 8. 分 享 思 维 导 图 - 将 思 维 导 图 以 图 片 形 式 分 享
/ / /
/ / / 权 限 控 制 :
/ / / - 复 制 / 导 出 转 写 功 能 需 要 tasktype > = 3 且 tasktype < 10002
/ / / - 复 制 / 导 出 / 思 维 导 图 功 能 需 要 tasktype > = 5 且 tasktype < 10001
/ / / = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = =
/ / / 分 享 底 部 弹 窗 - 有 状 态 组 件
/ / / 使 用 StatefulWidget以便在build方法中多次获取主题状态
class ShareBottomSheet extends StatefulWidget {
const ShareBottomSheet ( { super . key } ) ;
@ -26,28 +47,50 @@ class ShareBottomSheet extends StatefulWidget {
}
class _ShareBottomSheetState extends State < ShareBottomSheet > {
/ / / 会 议 详 情 控 制 器 - 通 过 GetX依赖注入获取
/ / / 包 含 会 议 数 据 、 转 写 列 表 、 总 结 内 容 等 核 心 数 据
final _controller = Get . find < MeetingDetailsController > ( ) ;
/ / / = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = =
/ / / 构 建 UI界面
/ / / = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = =
/ / / 整 体 布 局 结 构 :
/ / / - SafeArea: 适 配 刘 海 屏 等 异 形 屏 幕
/ / / - Padding: 水 平 方 向 12. w的内边距
/ / / - Column: 垂 直 排 列 的 弹 性 布 局
/ / / ├ ─ 头 部 区 域 : 会 议 标 题 + 关 闭 按 钮
/ / / └ ─ 功 能 列 表 区 域 : 3 个 功 能 分 组 盒 子
/ / / ├ ─ 第 一 组 : 分 享 链 接
/ / / ├ ─ 第 二 组 : 复 制 转 写 、 复 制 总 结
/ / / └ ─ 第 三 组 : 导 出 音 频 、 导 出 转 写 、 导 出 总 结 、 保 存 思 维 导 图 、 分 享 思 维 导 图
/ / / = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = =
@ override
Widget build ( BuildContext context ) {
/ / 获 取 当 前 主 题 模 式 ( 深 色 / 浅 色 ) , 用 于 UI颜色适配
final isDarkMode = Theme . of ( context ) . brightness = = Brightness . dark ;
return SafeArea (
/ / top: false 表 示 不 保 护 顶 部 安 全 区 域 , 让 弹 窗 可 以 延 伸 到 状 态 栏 下 方
top: false ,
child: Padding (
/ / 水 平 方 向 12. w的内边距 , 使 用 flutter_screenutil进行屏幕适配
padding: EdgeInsets . symmetric ( horizontal: 12. w ) ,
child: Column (
/ / 主 轴 尺 寸 最 小 化 , 只 占 用 内 容 所 需 高 度
mainAxisSize: MainAxisSize . min ,
children: [
/ / = = = = = = = = = = = = = = = = = = = = 头 部 区 域 : 会 议 标 题 栏 = = = = = = = = = = = = = = = = = = = =
Container (
padding: EdgeInsets . symmetric ( vertical: 10. w ) ,
child: Row (
children: [
/ / 音 频 文 件 图 标
Icon (
Icons . audio_file_outlined ,
color: isDarkMode ? Colors . grey [ 500 ] : Colors . grey ,
size: 32. w ,
) ,
5. horizontalSpace ,
5. horizontalSpace , / / 5. w的水平间距
/ / 会 议 标 题 文 本 - 从 控 制 器 获 取
Expanded (
child: Text (
_controller . meetingData . value . title ,
@ -57,6 +100,7 @@ class _ShareBottomSheetState extends State<ShareBottomSheet> {
) ,
) ,
) ,
/ / 关 闭 按 钮 - 点 击 后 关 闭 底 部 弹 窗
GestureDetector (
onTap: ( ) = > Get . back ( ) ,
child: Container (
@ -76,15 +120,26 @@ class _ShareBottomSheetState extends State<ShareBottomSheet> {
] ,
) ,
) ,
/ / = = = = = = = = = = = = = = = = = = = = 功 能 列 表 区 域 = = = = = = = = = = = = = = = = = = = =
Padding (
padding: EdgeInsets . symmetric ( vertical: 10. w ) ,
child: Column (
children: [
/ / - - - - - - - - - - - - - - - - - - 功 能 组 1 : 分 享 链 接 - - - - - - - - - - - - - - - - - -
_box ( [
_shareItem (
Icons . link ,
' shareLink ' . tr , / / 对 应 中 文 : 分 享 链 接
isBorder: false ,
/ / 【 核 心 功 能 模 块 1 : 分 享 链 接 】
/ / 功 能 说 明 : 生 成 会 议 分 享 链 接 并 通 过 系 统 分 享 面 板 分 享
/ / 执 行 流 程 :
/ / 1. 关 闭 底 部 弹 窗
/ / 2. 从 本 地 存 储 获 取 用 户 登 录 token
/ / 3. 获 取 会 议 ID和服务器地址
/ / 4. 构 建 分 享 URL格式 : https: / / share . deepechomeet . com / share / { serverHost } / voitrans . net / { id } / { token }
/ / 5. 调 用 SharePlus分享链接
/ / 6. 分 享 成 功 后 显 示 提 示
onTap: ( ) async {
Get . back ( ) ;
final GetStorage storage = GetStorage ( ) ;
@ -118,7 +173,17 @@ class _ShareBottomSheetState extends State<ShareBottomSheet> {
} ,
) ,
] ) ,
/ / - - - - - - - - - - - - - - - - - - 功 能 组 2 : 复 制 功 能 - - - - - - - - - - - - - - - - - -
_box ( [
/ / 【 核 心 功 能 模 块 2 : 复 制 转 写 】
/ / 功 能 说 明 : 将 会 议 所 有 转 写 文 本 复 制 到 系 统 剪 贴 板
/ / 权 限 控 制 : 仅 当 tasktype > = 3 且 tasktype < 10002 时 可 用
/ / 执 行 流 程 :
/ / 1. 检 查 权 限 条 件 , 不 满 足 则 按 钮 置 灰 不 可 点 击
/ / 2. 点 击 后 关 闭 底 部 弹 窗
/ / 3. 调 用 _getAllText ( ) 获 取 格 式 化 后 的 转 写 文 本
/ / 4. 调 用 _copy ( ) 方 法 复 制 到 剪 贴 板
/ / 数 据 格 式 : 说 话 人 + 时 间 戳 + 内 容
_shareItem ( Icons . copy , ' copyTranscript ' . tr , / / 对 应 中 文 : 复 制 转 写
onTap: _controller . meetingDetails . value . tasktype > = 3 & &
_controller . meetingDetails . value . tasktype <
@ -128,6 +193,14 @@ class _ShareBottomSheetState extends State<ShareBottomSheet> {
_copy ( _getAllText ( ) ) ;
}
: null ) ,
/ / 【 核 心 功 能 模 块 3 : 复 制 总 结 】
/ / 功 能 说 明 : 将 会 议 总 结 内 容 复 制 到 系 统 剪 贴 板
/ / 权 限 控 制 : 仅 当 tasktype > = 5 且 tasktype < 10001 时 可 用
/ / 执 行 流 程 :
/ / 1. 检 查 权 限 条 件 , 不 满 足 则 按 钮 置 灰 不 可 点 击
/ / 2. 点 击 后 关 闭 底 部 弹 窗
/ / 3. 调 用 _markdownToPlainText ( ) 将 Markdown格式转为纯文本
/ / 4. 调 用 _copy ( ) 方 法 复 制 到 剪 贴 板
_shareItem ( Icons . copy , ' copySummary ' . tr , / / 对 应 中 文 : 复 制 总 结
isBorder: false ,
onTap: _controller . meetingDetails . value . tasktype > = 5 & &
@ -140,7 +213,16 @@ class _ShareBottomSheetState extends State<ShareBottomSheet> {
}
: null ) ,
] ) ,
/ / - - - - - - - - - - - - - - - - - - 功 能 组 3 : 导 出 与 分 享 功 能 - - - - - - - - - - - - - - - - - -
_box ( [
/ / 【 核 心 功 能 模 块 4 : 导 出 音 频 】
/ / 功 能 说 明 : 分 享 会 议 录 音 音 频 文 件
/ / 执 行 流 程 :
/ / 1. 点 击 后 关 闭 底 部 弹 窗
/ / 2. 调 用 _share ( ) 方 法 分 享 音 频 文 件 路 径
/ / 参 数 说 明 :
/ / - filepath: 从 meetingData 获 取 的 音 频 文 件 路 径
/ / - title: 分 享 时 显 示 的 标 题 文 本
_shareItem (
Icons . multitrack_audio , ' exportAudio ' . tr , / / 对 应 中 文 : 导 出 音 频
onTap: ( ) {
@ -148,6 +230,16 @@ class _ShareBottomSheetState extends State<ShareBottomSheet> {
_share ( _controller . meetingData . value . filepath ,
' shareMeetingAudio ' . tr ) ; / / 对 应 中 文 : 分 享 会 议 音 频
} ) ,
/ / 【 核 心 功 能 模 块 5 : 导 出 转 写 】
/ / 功 能 说 明 : 将 转 写 内 容 导 出 为 TXT文件并分享
/ / 权 限 控 制 : 仅 当 tasktype > = 3 且 tasktype < 10002 时 可 用
/ / 执 行 流 程 :
/ / 1. 检 查 权 限 条 件 , 不 满 足 则 按 钮 置 灰 不 可 点 击
/ / 2. 点 击 后 关 闭 底 部 弹 窗
/ / 3. 获 取 临 时 目 录 路 径
/ / 4. 创 建 以 会 议 标 题 命 名 的 TXT文件
/ / 5. 调 用 _getAllText ( ) 获 取 转 写 内 容 并 写 入 文 件
/ / 6. 调 用 _share ( ) 方 法 分 享 文 件
_shareItem (
Icons . message , ' exportTranscript ' . tr , / / 对 应 中 文 : 导 出 转 写
onTap: _controller . meetingDetails . value . tasktype > = 3 & &
@ -164,6 +256,16 @@ class _ShareBottomSheetState extends State<ShareBottomSheet> {
' exportTranscript ' . tr ) ; / / 对 应 中 文 : 分 享 会 议 转 写
}
: null ) ,
/ / 【 核 心 功 能 模 块 6 : 导 出 总 结 】
/ / 功 能 说 明 : 将 总 结 内 容 导 出 为 TXT或PDF格式
/ / 权 限 控 制 : 仅 当 tasktype > = 5 且 tasktype < 10001 时 可 用
/ / 执 行 流 程 :
/ / 1. 检 查 权 限 条 件 , 不 满 足 则 按 钮 置 灰 不 可 点 击
/ / 2. 点 击 后 关 闭 底 部 弹 窗
/ / 3. 弹 出 二 级 底 部 弹 窗 供 用 户 选 择 导 出 格 式 ( TXT / PDF )
/ / 4. 根 据 选 择 执 行 对 应 导 出 逻 辑
/ / - TXT: 创 建 临 时 文 件 , 写 入 纯 文 本 内 容 , 调 用 _share ( ) 分 享
/ / - PDF: 调 用 _exportMarkdownPdf ( ) 方 法 生 成 PDF
_shareItem ( Icons . article , ' exportSummary ' . tr , / / 对 应 中 文 : 导 出 总 结
onTap: _controller . meetingDetails . value . tasktype > = 5 & &
_controller . meetingDetails . value . tasktype <
@ -174,9 +276,11 @@ class _ShareBottomSheetState extends State<ShareBottomSheet> {
SecondLevelBottomSheet (
' exportSummary ' . tr , / / 对 应 中 文 : 导 出 总 结
' exportAs ' . tr , / / 对 应 中 文 : 导 出 为
/ / 回 调 函 数 : 用 户 选 择 导 出 格 式 后 的 处 理 逻 辑
/ / 参 数 index: 0 = TXT , 1 = PDF
( int index ) async {
if ( index = = 0 ) {
/ / 导 出 TXT
/ / 导 出 TXT格式
final tempDir =
await getTemporaryDirectory ( ) ;
final file = File (
@ -187,10 +291,11 @@ class _ShareBottomSheetState extends State<ShareBottomSheet> {
_share ( file . path ,
' exportSummary ' . tr ) ; / / 对 应 中 文 : 分 享 会 议 总 结
} else {
/ / 导 出 PDF
/ / 导 出 PDF格式
_exportMarkdownPdf ( ) ;
}
} ,
/ / 二 级 弹 窗 的 选 项 配 置
const [
{
' icon ' : Icons . text_snippet ,
@ -216,6 +321,17 @@ class _ShareBottomSheetState extends State<ShareBottomSheet> {
) ;
}
: null ) ,
/ / 【 核 心 功 能 模 块 7 : 保 存 思 维 导 图 】
/ / 功 能 说 明 : 将 思 维 导 图 保 存 为 图 片 到 本 地 相 册
/ / 权 限 控 制 : 仅 当 tasktype > = 5 且 tasktype < 10001 时 可 用
/ / 执 行 流 程 :
/ / 1. 检 查 权 限 条 件 , 不 满 足 则 按 钮 置 灰 不 可 点 击
/ / 2. 点 击 后 关 闭 底 部 弹 窗
/ / 3. 设 置 imageType = 1 表 示 保 存 操 作
/ / 4. 检 查 WebView是否已加载完成
/ / - 已 就 绪 : 直 接 执 行 JavaScript 的 captureImage ( ) 函 数
/ / - 未 就 绪 : 设 置 导 航 委 托 , 在 页 面 加 载 完 成 后 执 行
/ / 交 互 组 件 : 与 MindMapController 和 WebView 协 同 工 作
_shareItem (
Icons . save_alt ,
' saveMindMap ' . tr ,
@ -225,7 +341,7 @@ class _ShareBottomSheetState extends State<ShareBottomSheet> {
Get . back ( ) ;
final mindMapController =
Get . find < MindMapController > ( ) ;
mindMapController . imageType = 1 ;
mindMapController . imageType = 1 ; / / 1 = 保 存 到 本 地
if ( mindMapController . isWebViewReady ) {
mindMapController . webViewController
. runJavaScript ( ' captureImage() ' ) ;
@ -244,6 +360,18 @@ class _ShareBottomSheetState extends State<ShareBottomSheet> {
}
: null ,
) ,
/ / 【 核 心 功 能 模 块 8 : 分 享 思 维 导 图 】
/ / 功 能 说 明 : 将 思 维 导 图 以 图 片 形 式 通 过 系 统 分 享 面 板 分 享
/ / 权 限 控 制 : 仅 当 tasktype > = 5 且 tasktype < 10001 时 可 用
/ / 执 行 流 程 :
/ / 1. 检 查 权 限 条 件 , 不 满 足 则 按 钮 置 灰 不 可 点 击
/ / 2. 点 击 后 关 闭 底 部 弹 窗
/ / 3. 设 置 imageType = 2 表 示 分 享 操 作
/ / 4. 检 查 WebView是否已加载完成
/ / - 已 就 绪 : 直 接 执 行 JavaScript 的 captureImage ( ) 函 数
/ / - 未 就 绪 : 设 置 导 航 委 托 , 在 页 面 加 载 完 成 后 执 行
/ / 交 互 组 件 : 与 MindMapController 和 WebView 协 同 工 作
/ / 注 意 : 与 保 存 思 维 导 图 的 区 别 在 于 imageType 的 值 不 同 , 后 续 处 理 逻 辑 不 同
_shareItem (
Icons . lan ,
' shareMindMap ' . tr , / / 对 应 中 文 : 分 享 思 维 导 图
@ -254,7 +382,7 @@ class _ShareBottomSheetState extends State<ShareBottomSheet> {
Get . back ( ) ;
final mindMapController =
Get . find < MindMapController > ( ) ;
mindMapController . imageType = 2 ;
mindMapController . imageType = 2 ; / / 2 = 分 享
if ( mindMapController . isWebViewReady ) {
mindMapController . webViewController
. runJavaScript ( ' captureImage() ' ) ;
@ -283,6 +411,21 @@ class _ShareBottomSheetState extends State<ShareBottomSheet> {
) ;
}
/ / / = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = =
/ / / UI组件构建方法
/ / / = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = =
/ / / 功 能 分 组 盒 子 组 件
/ / / 用 于 将 相 关 的 功 能 项 组 合 在 一 起 , 提 供 统 一 的 圆 角 和 背 景 样 式
/ / /
/ / / 参 数 说 明 :
/ / / - children: 子 组 件 列 表 , 通 常 为 多 个 _shareItem
/ / /
/ / / 样 式 特 性 :
/ / / - 底 部 外 边 距 : 10. w
/ / / - 裁 剪 行 为 : 硬 边 缘 裁 剪
/ / / - 背 景 色 : 深 色 模 式 # 2 D2D2D , 浅 色 模 式 白 色
/ / / - 圆 角 半 径 : 12. r
Widget _box ( List < Widget > children ) {
final isDarkMode = Theme . of ( context ) . brightness = = Brightness . dark ;
return Container (
@ -298,6 +441,20 @@ class _ShareBottomSheetState extends State<ShareBottomSheet> {
) ;
}
/ / / 分 享 功 能 项 组 件
/ / / 单 个 功 能 按 钮 的 UI封装 , 支 持 图 标 、 标 题 、 点 击 事 件 和 禁 用 状 态
/ / /
/ / / 参 数 说 明 :
/ / / - icon: 功 能 图 标 ( IconData类型 )
/ / / - title: 功 能 标 题 文 本
/ / / - isBorder: 是 否 显 示 底 部 边 框 , 用 于 分 隔 多 个 功 能 项 ( 默 认 true )
/ / / - onTap: 点 击 回 调 函 数 , 为 null时按钮置灰不可点击
/ / /
/ / / 样 式 特 性 :
/ / / - 水 平 内 边 距 : 12. w , 垂 直 内 边 距 : 14. w
/ / / - 禁 用 状 态 背 景 色 : 深 色 模 式 grey [ 800 ] , 浅 色 模 式 grey [ 200 ]
/ / / - 边 框 颜 色 : 深 色 模 式 grey [ 700 ] , 浅 色 模 式 grey [ 300 ]
/ / / - 图 标 和 文 字 透 明 度 : 启 用 状 态 1.0 , 禁 用 状 态 0.5
Widget _shareItem (
IconData icon ,
String title , {
@ -324,6 +481,7 @@ class _ShareBottomSheetState extends State<ShareBottomSheet> {
) ,
child: Row (
children: [
/ / 图 标 - 根 据 启 用 状 态 调 整 透 明 度
Opacity (
opacity: onTap ! = null ? 1.0 : 0.5 ,
child: Icon (
@ -331,7 +489,8 @@ class _ShareBottomSheetState extends State<ShareBottomSheet> {
color: isDarkMode ? Colors . white : Colors . black87 ,
) ,
) ,
10. horizontalSpace ,
10. horizontalSpace , / / 图 标 与 文 字 间 距
/ / 标 题 文 本 - 根 据 启 用 状 态 调 整 透 明 度
Expanded (
child: Text (
title ,
@ -348,6 +507,23 @@ class _ShareBottomSheetState extends State<ShareBottomSheet> {
) ;
}
/ / / = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = =
/ / / 核 心 功 能 方 法
/ / / = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = =
/ / / 分 享 文 件 方 法
/ / / 使 用 SharePlus 插 件 分 享 文 件 到 系 统 分 享 面 板
/ / /
/ / / 参 数 说 明 :
/ / / - filepath: 要 分 享 的 文 件 的 完 整 路 径
/ / / - title: 分 享 时 显 示 的 标 题 / 描 述 文 本
/ / /
/ / / 执 行 流 程 :
/ / / 1. 构 建 ShareParams 对 象 , 包 含 文 本 和 文 件 列 表
/ / / 2. 调 用 SharePlus . instance . share ( ) 触 发 系 统 分 享
/ / / 3. 检 查 分 享 结 果 状 态 , 成 功 时 显 示 提 示
/ / /
/ / / 返 回 值 : Future < void > - 异 步 操 作
Future < void > _share ( String filepath , String title ) async {
final result = await SharePlus . instance . share ( ShareParams (
text: title ,
@ -358,6 +534,21 @@ class _ShareBottomSheetState extends State<ShareBottomSheet> {
}
}
/ / / 复 制 文 本 到 剪 贴 板 方 法
/ / / 使 用 Flutter 的 Clipboard 服 务 将 文 本 复 制 到 系 统 剪 贴 板
/ / /
/ / / 参 数 说 明 :
/ / / - text: 要 复 制 的 文 本 内 容
/ / /
/ / / 执 行 流 程 :
/ / / 1. 调 用 Clipboard . setData ( ) 设 置 剪 贴 板 数 据
/ / / 2. 复 制 成 功 后 显 示 GetX Snackbar 提 示
/ / /
/ / / 提 示 样 式 :
/ / / - 标 题 : ' success ' . tr ( 成 功 )
/ / / - 内 容 : ' copySuccess ' . tr ( 复 制 成 功 )
/ / / - 背 景 色 : 蓝 色 半 透 明
/ / / - 文 字 颜 色 : 白 色
void _copy ( String text ) {
Clipboard . setData ( ClipboardData (
text: text ,
@ -372,6 +563,27 @@ class _ShareBottomSheetState extends State<ShareBottomSheet> {
}
/ / / 将 Markdown格式转换为纯文本
/ / / 用 于 在 复 制 或 导 出 时 将 富 文 本 格 式 转 为 纯 文 本 , 便 于 阅 读 和 处 理
/ / /
/ / / 参 数 说 明 :
/ / / - markdown: Markdown格式的原始文本
/ / /
/ / / 返 回 值 : String - 转 换 后 的 纯 文 本
/ / /
/ / / 转 换 规 则 :
/ / / 1. 移 除 粗 体 标 记 * * text * * 或 __text__
/ / / 2. 移 除 斜 体 标 记 * text * 或 _text_
/ / / 3. 移 除 删 除 线 标 记 ~ ~ text ~ ~
/ / / 4. 移 除 代 码 块 标 记 ` ` ` code ` ` `
/ / / 5. 移 除 行 内 代 码 标 记 ` code `
/ / / 6. 移 除 链 接 标 记 [ text ] ( url ) , 保 留 文 本
/ / / 7. 移 除 图 片 标 记 ! [ alt ] ( url ) , 保 留 alt文本
/ / / 8. 移 除 标 题 标 记 # # # # # # 等
/ / / 9. 移 除 引 用 标 记 >
/ / / 10. 移 除 无 序 列 表 标 记 - * +
/ / / 11. 移 除 有 序 列 表 标 记 1. 2. 等
/ / / 12. 移 除 水 平 分 割 线 - - - * * * ___
/ / / 13. 清 理 多 余 空 行
String _markdownToPlainText ( String markdown ) {
String text = markdown ;
@ -428,22 +640,61 @@ class _ShareBottomSheetState extends State<ShareBottomSheet> {
return text . trim ( ) ;
}
/ / / 获 取 所 有 转 写 文 本
/ / / 将 会 议 转 写 列 表 格 式 化 为 带 说 话 人 和 时 间 戳 的 文 本
/ / /
/ / / 返 回 值 : String - 格 式 化 后 的 完 整 转 写 文 本
/ / /
/ / / 数 据 格 式 :
/ / / 说 话 人 时 间 戳
/ / / 内 容
/ / /
/ / / 示 例 输 出 :
/ / / 张 三 09 : 30 : 15
/ / / 大 家 好 , 会 议 开 始 。
/ / / 李 四 09 : 30 : 20
/ / / 收 到 , 请 继 续 。
/ / /
/ / / 数 据 来 源 :
/ / / - _controller . textList: 转 写 数 据 列 表
/ / / - speaker: 说 话 人 名 称
/ / / - starttime: 开 始 时 间 戳 ( 毫 秒 )
/ / / - content: 转 写 内 容
String _getAllText ( ) {
String text = ' ' ;
for ( var element in _controller . textList ) {
/ / 添 加 说 话 人 信 息 ( 如 果 存 在 )
if ( element [ ' speaker ' ] . isNotEmpty ) {
text + = ' ${ element [ ' speaker ' ] } ' ;
}
/ / 添 加 格 式 化 后 的 时 间 戳 ( UTC时间 , HH: mm: ss格式 )
text + = ' $ {DateUtil.formatDateMs(
element [ ' starttime ' ] ,
format: ' HH:mm:ss ' ,
isUtc: true ,
) } \ n ' ;
/ / 添 加 转 写 内 容
text + = ' ${ element [ ' content ' ] } \n ' ;
}
return text ;
}
/ / / 获 取 资 源 文 件 的 缩 略 图 文 件
/ / / 将 assets中的图片资源复制到临时目录 , 用 于 分 享 预 览
/ / /
/ / / 参 数 说 明 :
/ / / - assetPath: 资 源 文 件 在 assets目录中的路径
/ / / - fileName: 保 存 到 临 时 目 录 的 文 件 名
/ / /
/ / / 返 回 值 : Future < XFile > - 临 时 文 件 的 XFile对象
/ / /
/ / / 执 行 流 程 :
/ / / 1. 使 用 rootBundle . load ( ) 加 载 资 源 文 件 字 节 数 据
/ / / 2. 获 取 应 用 临 时 目 录
/ / / 3. 创 建 目 标 文 件 并 写 入 字 节 数 据
/ / / 4. 返 回 XFile对象供分享使用
/ / /
/ / / 注 意 : 当 前 代 码 中 此 方 法 未 被 实 际 调 用 ( 注 释 状 态 )
Future < XFile > getAssetThumbnailFile ( String assetPath , String fileName ) async {
final byteData = await rootBundle . load ( assetPath ) ;
final tempDir = await getTemporaryDirectory ( ) ;
@ -452,6 +703,25 @@ class _ShareBottomSheetState extends State<ShareBottomSheet> {
return XFile ( file . path ) ;
}
/ / / 导 出 Markdown为PDF文件
/ / / 将 会 议 总 结 内 容 转 换 为 PDF格式并分享
/ / /
/ / / 执 行 流 程 :
/ / / 1. 显 示 加 载 提 示 " 正在导出PDF... "
/ / / 2. 获 取 临 时 目 录 路 径
/ / / 3. 创 建 以 会 议 标 题 命 名 的 PDF文件
/ / / 4. 使 用 htmltopdfwidgets 插 件 将 Markdown转换为PDF组件列表
/ / / - 加 载 NotoSansSC 字 体 以 支 持 中 文 显 示
/ / / 5. 创 建 PDF文档并添加多页内容
/ / / 6. 保 存 PDF文件到临时目录
/ / / 7. 调 用 _share ( ) 方 法 分 享 PDF文件
/ / / 8. 关 闭 加 载 提 示
/ / /
/ / / 依 赖 组 件 :
/ / / - htmltopdfwidgets: 用 于 Markdown到PDF的转换
/ / / - NotoSansSC - Regular . ttf: 中 文 字 体 资 源
/ / /
/ / / 返 回 值 : Future < void > - 异 步 操 作
Future < void > _exportMarkdownPdf ( ) async {
EasyLoading . show ( status: ' exportingPDF ' . tr ) ; / / 对 应 中 文 : 正 在 导 出 PDF . . .
final tempDir = await getTemporaryDirectory ( ) ;