|
|
@ -17,6 +17,7 @@ class _MeetingMemberViewState extends State<MeetingMemberView> { |
|
|
final _controller = Get.put(MeetingMineController()); |
|
|
final _controller = Get.put(MeetingMineController()); |
|
|
|
|
|
|
|
|
int _tabsIndex = 0; |
|
|
int _tabsIndex = 0; |
|
|
|
|
|
int _upgradeIndex = 0; |
|
|
|
|
|
|
|
|
@override |
|
|
@override |
|
|
Widget build(BuildContext context) { |
|
|
Widget build(BuildContext context) { |
|
|
@ -61,7 +62,9 @@ class _MeetingMemberViewState extends State<MeetingMemberView> { |
|
|
_head(), |
|
|
_head(), |
|
|
_member(), |
|
|
_member(), |
|
|
_tabs(), |
|
|
_tabs(), |
|
|
_comparison(), |
|
|
_tabsIndex == 0 ? _comparison() : _detailed(), |
|
|
|
|
|
_upgrade(), |
|
|
|
|
|
_duration(), |
|
|
], |
|
|
], |
|
|
), |
|
|
), |
|
|
); |
|
|
); |
|
|
@ -338,82 +341,125 @@ class _MeetingMemberViewState extends State<MeetingMemberView> { |
|
|
], |
|
|
], |
|
|
), |
|
|
), |
|
|
), |
|
|
), |
|
|
_tables( |
|
|
_tableItem( |
|
|
'每月转写时长', |
|
|
'每月转写时长', |
|
|
'300', |
|
|
starter: '300', |
|
|
'1200', |
|
|
pro: '1200', |
|
|
'无限', |
|
|
unlimited: '无限', |
|
|
isGradient: true, |
|
|
isGradient: true, |
|
|
), |
|
|
), |
|
|
_tables( |
|
|
_tableItem( |
|
|
'专业模版', |
|
|
'专业模版', |
|
|
'有限', |
|
|
starter: '有限', |
|
|
'全量模版', |
|
|
pro: '全量模版', |
|
|
'全量模版', |
|
|
unlimited: '全量模版', |
|
|
), |
|
|
), |
|
|
_tables( |
|
|
_tableItem( |
|
|
'专业术语', |
|
|
'专业术语', |
|
|
'—', |
|
|
starter: '—', |
|
|
'', |
|
|
|
|
|
'', |
|
|
|
|
|
), |
|
|
), |
|
|
_tables( |
|
|
_tableItem( |
|
|
'自定义模版', |
|
|
'自定义模版', |
|
|
'—', |
|
|
starter: '—', |
|
|
'', |
|
|
|
|
|
'', |
|
|
|
|
|
), |
|
|
), |
|
|
_tables( |
|
|
_tableItem( |
|
|
'Ask AI', |
|
|
'Ask AI', |
|
|
'—', |
|
|
starter: '—', |
|
|
'', |
|
|
|
|
|
'', |
|
|
|
|
|
), |
|
|
), |
|
|
_tables( |
|
|
_tableItem( |
|
|
'可视化思维导图', |
|
|
'可视化思维导图', |
|
|
'', |
|
|
|
|
|
'', |
|
|
|
|
|
'', |
|
|
|
|
|
), |
|
|
), |
|
|
_tables( |
|
|
_tableItem( |
|
|
'区分说话人', |
|
|
'区分说话人', |
|
|
'', |
|
|
|
|
|
'', |
|
|
|
|
|
'', |
|
|
|
|
|
), |
|
|
), |
|
|
_tables( |
|
|
_tableItem( |
|
|
'Private Cloud Sync', |
|
|
'Private Cloud Sync', |
|
|
'', |
|
|
|
|
|
'', |
|
|
|
|
|
'', |
|
|
|
|
|
), |
|
|
), |
|
|
_tables( |
|
|
_tableItem( |
|
|
'AI 人声增强', |
|
|
'AI 人声增强', |
|
|
'', |
|
|
|
|
|
'', |
|
|
|
|
|
'', |
|
|
|
|
|
), |
|
|
), |
|
|
_tables( |
|
|
_tableItem( |
|
|
'音频导入', |
|
|
'音频导入', |
|
|
'', |
|
|
|
|
|
'', |
|
|
|
|
|
'', |
|
|
|
|
|
), |
|
|
), |
|
|
_tables( |
|
|
_tableItem( |
|
|
'支持多种导出格式', |
|
|
'支持多种导出格式', |
|
|
'', |
|
|
|
|
|
'', |
|
|
|
|
|
'', |
|
|
|
|
|
), |
|
|
), |
|
|
], |
|
|
], |
|
|
); |
|
|
); |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
Widget _tables( |
|
|
Widget _detailed() { |
|
|
String title, |
|
|
return Column( |
|
|
String starter, |
|
|
children: [ |
|
|
String pro, |
|
|
_detailedItem( |
|
|
String unlimited, { |
|
|
Icons.description, |
|
|
|
|
|
Colors.purpleAccent, |
|
|
|
|
|
'专业总结模版', |
|
|
|
|
|
'专业模版设计,提高您的工作效率。根据行业需求量身定制。', |
|
|
|
|
|
), |
|
|
|
|
|
_detailedItem( |
|
|
|
|
|
Icons.edit_note, |
|
|
|
|
|
Colors.purpleAccent, |
|
|
|
|
|
'自定义模版', |
|
|
|
|
|
'您可以根据需求自定义总结 Prompts,并用它们生成所需的总结。', |
|
|
|
|
|
), |
|
|
|
|
|
_detailedItem( |
|
|
|
|
|
Icons.psychology, |
|
|
|
|
|
Colors.purpleAccent, |
|
|
|
|
|
'Ask AI', |
|
|
|
|
|
'从录音中智能挖掘更深入信息,一键生成数据表格、关键讨论结论、To Do、汇报邮件等格式内容。', |
|
|
|
|
|
), |
|
|
|
|
|
_detailedItem( |
|
|
|
|
|
Icons.account_tree, |
|
|
|
|
|
Colors.purpleAccent, |
|
|
|
|
|
'可视化思维导图', |
|
|
|
|
|
'超越总结-用思维导图整理和可视化要点,更有效地理解全文。', |
|
|
|
|
|
), |
|
|
|
|
|
_detailedItem( |
|
|
|
|
|
Icons.groups, |
|
|
|
|
|
Colors.purpleAccent, |
|
|
|
|
|
'模版社区', |
|
|
|
|
|
'发现、分享,并从用户创建的模版库中获得灵感。', |
|
|
|
|
|
), |
|
|
|
|
|
_detailedItem( |
|
|
|
|
|
Icons.people, |
|
|
|
|
|
Colors.red, |
|
|
|
|
|
'区分说话人', |
|
|
|
|
|
'音频转写将支持区分发言者,更直观的还原会议或电话通话内容。同时总结将更加准确。', |
|
|
|
|
|
), |
|
|
|
|
|
_detailedItem( |
|
|
|
|
|
Icons.cloud_sync, |
|
|
|
|
|
Colors.red, |
|
|
|
|
|
'Private Cloud Sync', |
|
|
|
|
|
'您的录音和转写等数据将安全存储在专属的云端服务器中,无论是上传还是下载,全程加密处理,确保隐私安全。', |
|
|
|
|
|
), |
|
|
|
|
|
_detailedItem( |
|
|
|
|
|
Icons.graphic_eq, |
|
|
|
|
|
Colors.red, |
|
|
|
|
|
'AI人声增强', |
|
|
|
|
|
'Al 人声增强支持多档降噪设置,智能消除背景噪音,增强语音清晰度,提升音频回放效果。', |
|
|
|
|
|
), |
|
|
|
|
|
_detailedItem( |
|
|
|
|
|
Icons.file_upload, |
|
|
|
|
|
Colors.red, |
|
|
|
|
|
'音频导入', |
|
|
|
|
|
'可以轻松从本地或第三方应用导入音频文件,如语音备忘录、Google云端硬盘等。', |
|
|
|
|
|
), |
|
|
|
|
|
_detailedItem( |
|
|
|
|
|
Icons.file_download, |
|
|
|
|
|
Colors.blue, |
|
|
|
|
|
'多种导出格式', |
|
|
|
|
|
'导出您的音频录音、转写文本和摘要为各种格式(TXT、PDF、JPEG),以满足您的需求。', |
|
|
|
|
|
), |
|
|
|
|
|
], |
|
|
|
|
|
); |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
Widget _tableItem( |
|
|
|
|
|
String title, { |
|
|
|
|
|
String starter = '', |
|
|
|
|
|
String pro = '', |
|
|
|
|
|
String unlimited = '', |
|
|
bool isGradient = false, |
|
|
bool isGradient = false, |
|
|
}) { |
|
|
}) { |
|
|
return Container( |
|
|
return Container( |
|
|
@ -511,6 +557,61 @@ class _MeetingMemberViewState extends State<MeetingMemberView> { |
|
|
); |
|
|
); |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
Widget _detailedItem( |
|
|
|
|
|
IconData icon, |
|
|
|
|
|
Color color, |
|
|
|
|
|
String title, |
|
|
|
|
|
String description, |
|
|
|
|
|
) { |
|
|
|
|
|
return Container( |
|
|
|
|
|
margin: EdgeInsets.symmetric(vertical: 10.w), |
|
|
|
|
|
child: Row( |
|
|
|
|
|
crossAxisAlignment: CrossAxisAlignment.start, |
|
|
|
|
|
children: [ |
|
|
|
|
|
Container( |
|
|
|
|
|
width: 40.w, |
|
|
|
|
|
height: 40.w, |
|
|
|
|
|
margin: EdgeInsets.only(right: 10.w), |
|
|
|
|
|
decoration: BoxDecoration( |
|
|
|
|
|
color: color, |
|
|
|
|
|
borderRadius: BorderRadius.circular(12.r), |
|
|
|
|
|
), |
|
|
|
|
|
child: Icon( |
|
|
|
|
|
icon, |
|
|
|
|
|
size: 24.w, |
|
|
|
|
|
color: Colors.white, |
|
|
|
|
|
), |
|
|
|
|
|
), |
|
|
|
|
|
Expanded( |
|
|
|
|
|
child: Column( |
|
|
|
|
|
crossAxisAlignment: CrossAxisAlignment.start, |
|
|
|
|
|
children: [ |
|
|
|
|
|
Text( |
|
|
|
|
|
title, |
|
|
|
|
|
style: TextStyle( |
|
|
|
|
|
color: Colors.white, |
|
|
|
|
|
fontSize: 14.sp, |
|
|
|
|
|
fontWeight: FontWeight.bold, |
|
|
|
|
|
), |
|
|
|
|
|
), |
|
|
|
|
|
Padding( |
|
|
|
|
|
padding: EdgeInsets.only(top: 4.w), |
|
|
|
|
|
child: Text( |
|
|
|
|
|
description, |
|
|
|
|
|
style: TextStyle( |
|
|
|
|
|
color: Colors.grey[400], |
|
|
|
|
|
fontSize: 12.sp, |
|
|
|
|
|
), |
|
|
|
|
|
), |
|
|
|
|
|
), |
|
|
|
|
|
], |
|
|
|
|
|
), |
|
|
|
|
|
), |
|
|
|
|
|
], |
|
|
|
|
|
), |
|
|
|
|
|
); |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
Widget _check(bool isGradient) { |
|
|
Widget _check(bool isGradient) { |
|
|
return Container( |
|
|
return Container( |
|
|
width: 20.w, |
|
|
width: 20.w, |
|
|
@ -534,4 +635,378 @@ class _MeetingMemberViewState extends State<MeetingMemberView> { |
|
|
), |
|
|
), |
|
|
); |
|
|
); |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
Widget _upgrade() { |
|
|
|
|
|
return Column( |
|
|
|
|
|
crossAxisAlignment: CrossAxisAlignment.start, |
|
|
|
|
|
children: [ |
|
|
|
|
|
Container( |
|
|
|
|
|
margin: EdgeInsets.only(top: 30.w), |
|
|
|
|
|
alignment: Alignment.center, |
|
|
|
|
|
child: Text( |
|
|
|
|
|
'升级您的会员', |
|
|
|
|
|
style: TextStyle( |
|
|
|
|
|
color: Colors.white, |
|
|
|
|
|
fontSize: 24.sp, |
|
|
|
|
|
fontWeight: FontWeight.bold, |
|
|
|
|
|
), |
|
|
|
|
|
), |
|
|
|
|
|
), |
|
|
|
|
|
Padding( |
|
|
|
|
|
padding: EdgeInsets.symmetric(vertical: 15.w), |
|
|
|
|
|
child: Row( |
|
|
|
|
|
mainAxisAlignment: MainAxisAlignment.center, |
|
|
|
|
|
children: [ |
|
|
|
|
|
GestureDetector( |
|
|
|
|
|
onTap: () { |
|
|
|
|
|
setState(() { |
|
|
|
|
|
_upgradeIndex = 0; |
|
|
|
|
|
}); |
|
|
|
|
|
}, |
|
|
|
|
|
behavior: HitTestBehavior.translucent, |
|
|
|
|
|
child: Container( |
|
|
|
|
|
height: 36.w, |
|
|
|
|
|
padding: EdgeInsets.symmetric(horizontal: 15.w), |
|
|
|
|
|
alignment: Alignment.center, |
|
|
|
|
|
decoration: _upgradeIndex == 0 |
|
|
|
|
|
? BoxDecoration( |
|
|
|
|
|
color: Colors.grey[700], |
|
|
|
|
|
borderRadius: BorderRadius.circular(36.r), |
|
|
|
|
|
) |
|
|
|
|
|
: null, |
|
|
|
|
|
child: Text( |
|
|
|
|
|
'年订阅', |
|
|
|
|
|
style: TextStyle( |
|
|
|
|
|
color: Colors.white, |
|
|
|
|
|
fontSize: 16.sp, |
|
|
|
|
|
), |
|
|
|
|
|
), |
|
|
|
|
|
), |
|
|
|
|
|
), |
|
|
|
|
|
GestureDetector( |
|
|
|
|
|
onTap: () { |
|
|
|
|
|
setState(() { |
|
|
|
|
|
_upgradeIndex = 1; |
|
|
|
|
|
}); |
|
|
|
|
|
}, |
|
|
|
|
|
behavior: HitTestBehavior.translucent, |
|
|
|
|
|
child: Container( |
|
|
|
|
|
height: 36.w, |
|
|
|
|
|
padding: EdgeInsets.symmetric(horizontal: 15.w), |
|
|
|
|
|
alignment: Alignment.center, |
|
|
|
|
|
decoration: _upgradeIndex == 1 |
|
|
|
|
|
? BoxDecoration( |
|
|
|
|
|
color: Colors.grey[700], |
|
|
|
|
|
borderRadius: BorderRadius.circular(36.r), |
|
|
|
|
|
) |
|
|
|
|
|
: null, |
|
|
|
|
|
child: Text( |
|
|
|
|
|
'月订阅', |
|
|
|
|
|
style: TextStyle( |
|
|
|
|
|
color: Colors.white, |
|
|
|
|
|
fontSize: 16.sp, |
|
|
|
|
|
), |
|
|
|
|
|
), |
|
|
|
|
|
), |
|
|
|
|
|
), |
|
|
|
|
|
], |
|
|
|
|
|
), |
|
|
|
|
|
), |
|
|
|
|
|
if (_upgradeIndex == 0) |
|
|
|
|
|
_upgradeItem( |
|
|
|
|
|
'Pro ¥60/月', |
|
|
|
|
|
'7天免费试用,之后按¥800/年。试用期结束前可随时取消。', |
|
|
|
|
|
'7天免费试用', |
|
|
|
|
|
onTap: () {}, |
|
|
|
|
|
), |
|
|
|
|
|
if (_upgradeIndex == 0) |
|
|
|
|
|
_upgradeItem( |
|
|
|
|
|
'Unlimited ¥120/月', |
|
|
|
|
|
'7天免费试用,之后按¥1600/年。试用期结束前可随时取消。', |
|
|
|
|
|
'7天免费试用', |
|
|
|
|
|
isGolden: true, |
|
|
|
|
|
onTap: () {}, |
|
|
|
|
|
), |
|
|
|
|
|
if (_upgradeIndex == 0) |
|
|
|
|
|
Padding( |
|
|
|
|
|
padding: EdgeInsets.only(left: 10.w, top: 2.w), |
|
|
|
|
|
child: Text( |
|
|
|
|
|
'*免费试用7天,然后按年收费,随时取消。', |
|
|
|
|
|
style: TextStyle( |
|
|
|
|
|
color: Colors.grey, |
|
|
|
|
|
fontSize: 12.sp, |
|
|
|
|
|
), |
|
|
|
|
|
), |
|
|
|
|
|
), |
|
|
|
|
|
if (_upgradeIndex == 1) |
|
|
|
|
|
_upgradeItem( |
|
|
|
|
|
'Pro ¥120', |
|
|
|
|
|
'¥120/月', |
|
|
|
|
|
'订阅', |
|
|
|
|
|
onTap: () {}, |
|
|
|
|
|
), |
|
|
|
|
|
if (_upgradeIndex == 1) |
|
|
|
|
|
_upgradeItem( |
|
|
|
|
|
'Unlimited ¥198', |
|
|
|
|
|
'¥198/月', |
|
|
|
|
|
'订阅', |
|
|
|
|
|
isGolden: true, |
|
|
|
|
|
onTap: () {}, |
|
|
|
|
|
), |
|
|
|
|
|
Padding( |
|
|
|
|
|
padding: EdgeInsets.only(left: 10.w, top: 15.w), |
|
|
|
|
|
child: Text( |
|
|
|
|
|
'*升级订阅后,原订阅的剩余天数会自动折算差价并退还至您的支付账户', |
|
|
|
|
|
style: TextStyle( |
|
|
|
|
|
color: Colors.grey, |
|
|
|
|
|
fontSize: 12.sp, |
|
|
|
|
|
), |
|
|
|
|
|
), |
|
|
|
|
|
), |
|
|
|
|
|
], |
|
|
|
|
|
); |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
Widget _upgradeItem( |
|
|
|
|
|
String title, |
|
|
|
|
|
String description, |
|
|
|
|
|
String btnText, { |
|
|
|
|
|
Function()? onTap, |
|
|
|
|
|
bool isGolden = false, |
|
|
|
|
|
}) { |
|
|
|
|
|
return Container( |
|
|
|
|
|
padding: EdgeInsets.symmetric(horizontal: 15.w, vertical: 12.w), |
|
|
|
|
|
margin: EdgeInsets.symmetric(vertical: 5.w), |
|
|
|
|
|
decoration: BoxDecoration( |
|
|
|
|
|
color: const Color(0xFF1A1A1A), |
|
|
|
|
|
borderRadius: BorderRadius.circular(12.r), |
|
|
|
|
|
border: Border.all( |
|
|
|
|
|
color: Colors.grey[700]!, |
|
|
|
|
|
), |
|
|
|
|
|
), |
|
|
|
|
|
child: Row( |
|
|
|
|
|
children: [ |
|
|
|
|
|
Expanded( |
|
|
|
|
|
child: Column( |
|
|
|
|
|
crossAxisAlignment: CrossAxisAlignment.start, |
|
|
|
|
|
children: [ |
|
|
|
|
|
Text( |
|
|
|
|
|
title, |
|
|
|
|
|
style: TextStyle( |
|
|
|
|
|
color: Colors.white, |
|
|
|
|
|
fontSize: 16.sp, |
|
|
|
|
|
fontWeight: FontWeight.bold, |
|
|
|
|
|
), |
|
|
|
|
|
), |
|
|
|
|
|
Padding( |
|
|
|
|
|
padding: EdgeInsets.only(top: 5.w), |
|
|
|
|
|
child: Text( |
|
|
|
|
|
description, |
|
|
|
|
|
style: TextStyle( |
|
|
|
|
|
color: Colors.grey, |
|
|
|
|
|
fontSize: 14.sp, |
|
|
|
|
|
fontWeight: FontWeight.bold, |
|
|
|
|
|
), |
|
|
|
|
|
), |
|
|
|
|
|
), |
|
|
|
|
|
], |
|
|
|
|
|
), |
|
|
|
|
|
), |
|
|
|
|
|
GestureDetector( |
|
|
|
|
|
onTap: onTap, |
|
|
|
|
|
child: Container( |
|
|
|
|
|
width: 100.w, |
|
|
|
|
|
padding: EdgeInsets.symmetric(vertical: 8.w), |
|
|
|
|
|
margin: EdgeInsets.only(left: 10.w), |
|
|
|
|
|
alignment: Alignment.center, |
|
|
|
|
|
decoration: BoxDecoration( |
|
|
|
|
|
borderRadius: BorderRadius.circular(50.w), |
|
|
|
|
|
gradient: LinearGradient( |
|
|
|
|
|
colors: isGolden |
|
|
|
|
|
? [Colors.amberAccent, Colors.white, Colors.amberAccent] |
|
|
|
|
|
: [Colors.blue, Colors.pink], |
|
|
|
|
|
begin: Alignment.centerLeft, |
|
|
|
|
|
end: Alignment.centerRight, |
|
|
|
|
|
), |
|
|
|
|
|
), |
|
|
|
|
|
child: Text( |
|
|
|
|
|
btnText, |
|
|
|
|
|
style: TextStyle( |
|
|
|
|
|
color: isGolden ? Colors.black : Colors.white, |
|
|
|
|
|
fontSize: 14.sp, |
|
|
|
|
|
fontWeight: FontWeight.bold, |
|
|
|
|
|
), |
|
|
|
|
|
), |
|
|
|
|
|
), |
|
|
|
|
|
), |
|
|
|
|
|
], |
|
|
|
|
|
), |
|
|
|
|
|
); |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
Widget _duration() { |
|
|
|
|
|
return Column( |
|
|
|
|
|
crossAxisAlignment: CrossAxisAlignment.start, |
|
|
|
|
|
children: [ |
|
|
|
|
|
Padding( |
|
|
|
|
|
padding: EdgeInsets.only(top: 20.w, bottom: 10.w), |
|
|
|
|
|
child: Text( |
|
|
|
|
|
'购买更多转写时长', |
|
|
|
|
|
style: TextStyle( |
|
|
|
|
|
color: Colors.white, |
|
|
|
|
|
fontSize: 16.sp, |
|
|
|
|
|
fontWeight: FontWeight.bold, |
|
|
|
|
|
), |
|
|
|
|
|
), |
|
|
|
|
|
), |
|
|
|
|
|
Row( |
|
|
|
|
|
children: [ |
|
|
|
|
|
_durationItem( |
|
|
|
|
|
'6,000分钟', |
|
|
|
|
|
'¥0.1/分钟', |
|
|
|
|
|
'¥600.00', |
|
|
|
|
|
'¥1200.00', |
|
|
|
|
|
onTap: () {}, |
|
|
|
|
|
), |
|
|
|
|
|
10.horizontalSpace, |
|
|
|
|
|
_durationItem( |
|
|
|
|
|
'3,000分钟', |
|
|
|
|
|
'¥0.11/分钟', |
|
|
|
|
|
'¥300.00', |
|
|
|
|
|
'¥600.00', |
|
|
|
|
|
onTap: () {}, |
|
|
|
|
|
), |
|
|
|
|
|
], |
|
|
|
|
|
), |
|
|
|
|
|
Row( |
|
|
|
|
|
children: [ |
|
|
|
|
|
_durationItem( |
|
|
|
|
|
'600分钟', |
|
|
|
|
|
'¥0.114/分钟', |
|
|
|
|
|
'¥60.00', |
|
|
|
|
|
'¥120.00', |
|
|
|
|
|
onTap: () {}, |
|
|
|
|
|
), |
|
|
|
|
|
10.horizontalSpace, |
|
|
|
|
|
_durationItem( |
|
|
|
|
|
'120分钟', |
|
|
|
|
|
'¥0.184/分钟', |
|
|
|
|
|
'¥12.00', |
|
|
|
|
|
'¥24.00', |
|
|
|
|
|
onTap: () {}, |
|
|
|
|
|
), |
|
|
|
|
|
], |
|
|
|
|
|
), |
|
|
|
|
|
Padding( |
|
|
|
|
|
padding: EdgeInsets.only(left: 10.w, top: 5.w, bottom: 20.w), |
|
|
|
|
|
child: Text.rich( |
|
|
|
|
|
TextSpan( |
|
|
|
|
|
text: '*有效期:', |
|
|
|
|
|
style: TextStyle( |
|
|
|
|
|
color: Colors.grey, |
|
|
|
|
|
fontSize: 12.sp, |
|
|
|
|
|
fontWeight: FontWeight.bold, |
|
|
|
|
|
), |
|
|
|
|
|
children: const [ |
|
|
|
|
|
TextSpan( |
|
|
|
|
|
text: '购买后立即激活,激活后2年内有效。', |
|
|
|
|
|
style: TextStyle( |
|
|
|
|
|
fontWeight: FontWeight.normal, |
|
|
|
|
|
), |
|
|
|
|
|
), |
|
|
|
|
|
], |
|
|
|
|
|
), |
|
|
|
|
|
), |
|
|
|
|
|
), |
|
|
|
|
|
], |
|
|
|
|
|
); |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
Widget _durationItem( |
|
|
|
|
|
String title, |
|
|
|
|
|
String description, |
|
|
|
|
|
String price, |
|
|
|
|
|
String originalPrice, { |
|
|
|
|
|
Function()? onTap, |
|
|
|
|
|
}) { |
|
|
|
|
|
return Expanded( |
|
|
|
|
|
child: Container( |
|
|
|
|
|
padding: EdgeInsets.symmetric(horizontal: 10.w, vertical: 8.w), |
|
|
|
|
|
margin: EdgeInsets.symmetric(vertical: 5.w), |
|
|
|
|
|
decoration: BoxDecoration( |
|
|
|
|
|
color: const Color(0xFF1A1A1A), |
|
|
|
|
|
borderRadius: BorderRadius.circular(12.r), |
|
|
|
|
|
border: Border.all( |
|
|
|
|
|
color: Colors.grey[700]!, |
|
|
|
|
|
), |
|
|
|
|
|
), |
|
|
|
|
|
child: Column( |
|
|
|
|
|
crossAxisAlignment: CrossAxisAlignment.start, |
|
|
|
|
|
children: [ |
|
|
|
|
|
Text( |
|
|
|
|
|
title, |
|
|
|
|
|
style: TextStyle( |
|
|
|
|
|
color: Colors.white, |
|
|
|
|
|
fontSize: 14.sp, |
|
|
|
|
|
), |
|
|
|
|
|
), |
|
|
|
|
|
Text( |
|
|
|
|
|
description, |
|
|
|
|
|
style: TextStyle( |
|
|
|
|
|
color: Colors.grey, |
|
|
|
|
|
fontSize: 12.sp, |
|
|
|
|
|
), |
|
|
|
|
|
), |
|
|
|
|
|
Row( |
|
|
|
|
|
children: [ |
|
|
|
|
|
Expanded( |
|
|
|
|
|
child: Column( |
|
|
|
|
|
crossAxisAlignment: CrossAxisAlignment.start, |
|
|
|
|
|
children: [ |
|
|
|
|
|
Text( |
|
|
|
|
|
price, |
|
|
|
|
|
style: TextStyle( |
|
|
|
|
|
color: Colors.amberAccent, |
|
|
|
|
|
fontSize: 14.sp, |
|
|
|
|
|
fontWeight: FontWeight.bold, |
|
|
|
|
|
), |
|
|
|
|
|
), |
|
|
|
|
|
Text( |
|
|
|
|
|
originalPrice, |
|
|
|
|
|
style: TextStyle( |
|
|
|
|
|
color: Colors.grey, |
|
|
|
|
|
fontSize: 12.sp, |
|
|
|
|
|
decoration: TextDecoration.lineThrough, |
|
|
|
|
|
decorationColor: Colors.grey, |
|
|
|
|
|
), |
|
|
|
|
|
), |
|
|
|
|
|
], |
|
|
|
|
|
), |
|
|
|
|
|
), |
|
|
|
|
|
GestureDetector( |
|
|
|
|
|
onTap: onTap, |
|
|
|
|
|
child: Container( |
|
|
|
|
|
padding: |
|
|
|
|
|
EdgeInsets.symmetric(horizontal: 15.w, vertical: 5.w), |
|
|
|
|
|
decoration: BoxDecoration( |
|
|
|
|
|
color: Colors.white, |
|
|
|
|
|
borderRadius: BorderRadius.circular(24.r), |
|
|
|
|
|
), |
|
|
|
|
|
child: Text( |
|
|
|
|
|
'购买', |
|
|
|
|
|
style: TextStyle( |
|
|
|
|
|
color: Colors.black, |
|
|
|
|
|
fontSize: 12.sp, |
|
|
|
|
|
fontWeight: FontWeight.bold, |
|
|
|
|
|
), |
|
|
|
|
|
), |
|
|
|
|
|
), |
|
|
|
|
|
), |
|
|
|
|
|
], |
|
|
|
|
|
), |
|
|
|
|
|
], |
|
|
|
|
|
), |
|
|
|
|
|
), |
|
|
|
|
|
); |
|
|
|
|
|
} |
|
|
} |
|
|
} |
|
|
|