Files
wushu/lib/views/profile/settings/learn-us.dart
Developer cba04235c8 release
2026-04-03 03:26:06 +08:00

927 lines
31 KiB
Dart
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
import 'package:flutter/material.dart';
import 'package:flutter/services.dart';
import 'package:get/get.dart';
import '../../../config/app_config.dart';
import '../../../constants/app_constants.dart';
import '../../../services/get/theme_controller.dart';
/// 时间: 2026-03-26
/// 功能: 了解我们页面
/// 介绍: 展示开发者信息、团队信息、官网和备案号
/// 最新变化: 新建页面
class LearnUsPage extends StatelessWidget {
const LearnUsPage({super.key});
@override
Widget build(BuildContext context) {
final themeController = Get.find<ThemeController>();
return Obx(() {
final isDark = themeController.isDarkMode;
final primaryColor = themeController.currentThemeColor;
return Scaffold(
backgroundColor: isDark
? const Color(0xFF1A1A1A)
: const Color(0xFFF5F5F5),
appBar: AppBar(
title: Text(
'了解我们',
style: TextStyle(color: primaryColor, fontWeight: FontWeight.bold),
),
backgroundColor: isDark ? const Color(0xFF2A2A2A) : Colors.white,
elevation: 0,
centerTitle: true,
leading: IconButton(
icon: Icon(Icons.arrow_back, color: primaryColor),
onPressed: () => Navigator.of(context).pop(),
),
),
body: ListView(
padding: const EdgeInsets.all(16),
children: [
_buildHeaderCard(),
const SizedBox(height: 16),
_buildOfficialSiteCard(isDark),
const SizedBox(height: 16),
_buildQQGroupCard(context, isDark),
const SizedBox(height: 16),
_buildDeveloperCard(context, isDark),
const SizedBox(height: 16),
_buildTeamCard(isDark),
const SizedBox(height: 16),
_buildIcpCard(context, isDark),
const SizedBox(height: 24),
_buildBottomIndicator(isDark),
],
),
);
});
}
Widget _buildHeaderCard() {
final themeController = Get.find<ThemeController>();
final primaryColor = themeController.currentThemeColor;
return Container(
padding: const EdgeInsets.all(24),
decoration: BoxDecoration(
gradient: LinearGradient(
colors: [
primaryColor.withAlpha(200),
primaryColor,
primaryColor.withAlpha(150),
],
begin: Alignment.topLeft,
end: Alignment.bottomRight,
),
borderRadius: BorderRadius.circular(16),
boxShadow: [
BoxShadow(
color: primaryColor.withAlpha(30),
blurRadius: 12,
offset: const Offset(0, 4),
),
],
),
child: Row(
children: [
Container(
width: 70,
height: 70,
decoration: BoxDecoration(
color: Colors.white.withValues(alpha: 0.2),
borderRadius: BorderRadius.circular(18),
),
child: const Center(
child: Text('📖', style: TextStyle(fontSize: 36)),
),
),
const SizedBox(width: 20),
Expanded(
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
const Text(
'情景诗词',
style: TextStyle(
fontSize: 26,
fontWeight: FontWeight.bold,
color: Colors.white,
),
),
const SizedBox(height: 6),
Text(
'在诗词里旅行,在文化中生长',
style: TextStyle(
fontSize: 13,
color: Colors.white.withValues(alpha: 0.85),
),
),
const SizedBox(height: 12),
Container(
padding: const EdgeInsets.symmetric(
horizontal: 12,
vertical: 6,
),
decoration: BoxDecoration(
color: Colors.white.withValues(alpha: 0.2),
borderRadius: BorderRadius.circular(16),
),
child: Row(
mainAxisSize: MainAxisSize.min,
children: [
Icon(
Icons.code,
size: 14,
color: Colors.white.withValues(alpha: 0.9),
),
const SizedBox(width: 6),
Text(
'版本 ${AppConfig.appVersion}',
style: const TextStyle(
fontSize: 12,
color: Colors.white,
),
),
],
),
),
],
),
),
],
),
);
}
Widget _buildOfficialSiteCard(bool isDark) {
final themeController = Get.find<ThemeController>();
final primaryColor = themeController.currentThemeColor;
return Container(
decoration: BoxDecoration(
color: isDark ? const Color(0xFF2A2A2A) : Colors.white,
borderRadius: BorderRadius.circular(16),
boxShadow: [
BoxShadow(
color: isDark
? Colors.black.withAlpha(30)
: Colors.black.withAlpha(5),
blurRadius: 10,
offset: const Offset(0, 2),
),
],
),
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Padding(
padding: const EdgeInsets.all(16),
child: Row(
children: [
Container(
padding: const EdgeInsets.all(8),
decoration: BoxDecoration(
color: primaryColor.withAlpha(10),
borderRadius: BorderRadius.circular(8),
),
child: Icon(Icons.language, color: primaryColor, size: 20),
),
const SizedBox(width: 12),
Text(
'官方网站',
style: TextStyle(
fontSize: 16,
fontWeight: FontWeight.bold,
color: isDark ? Colors.white : Colors.black,
),
),
],
),
),
Divider(height: 1, color: isDark ? Colors.grey[800] : null),
Padding(
padding: const EdgeInsets.all(16),
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Text(
'访问我们的官方网站了解更多信息',
style: TextStyle(
fontSize: 13,
color: isDark ? Colors.grey[400] : Colors.grey,
),
),
const SizedBox(height: 12),
_buildWebsiteItem(
'https://poe.vogov.cn/app.html',
'官方APP页',
isDark,
primaryColor,
),
const SizedBox(height: 12),
_buildWebsiteItem(
'https://poe.vogov.cn/',
'情景诗词在线版',
isDark,
primaryColor,
),
],
),
),
],
),
);
}
Widget _buildWebsiteItem(
String url,
String label,
bool isDark,
Color primaryColor,
) {
return Container(
width: double.infinity,
padding: const EdgeInsets.all(12),
decoration: BoxDecoration(
color: isDark ? const Color(0xFF3A3A3A) : Colors.grey[50],
borderRadius: BorderRadius.circular(8),
border: Border.all(
color: isDark
? Colors.grey[700]!.withAlpha(20)
: Colors.grey.withAlpha(20),
),
),
child: Row(
children: [
Icon(Icons.link, size: 16, color: primaryColor),
const SizedBox(width: 8),
Expanded(
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Text(
label,
style: TextStyle(
fontSize: 12,
color: isDark ? Colors.grey[400] : Colors.grey,
),
),
Text(url, style: TextStyle(fontSize: 14, color: primaryColor)),
],
),
),
const SizedBox(width: 8),
GestureDetector(
onTap: () {
Clipboard.setData(ClipboardData(text: url));
Get.snackbar(
'复制成功',
'链接已复制到剪贴板',
duration: const Duration(seconds: 2),
colorText: primaryColor,
snackPosition: SnackPosition.BOTTOM,
borderRadius: 8,
margin: const EdgeInsets.all(16),
);
},
child: Container(
padding: const EdgeInsets.all(4),
decoration: BoxDecoration(
color: primaryColor.withAlpha(10),
borderRadius: BorderRadius.circular(4),
),
child: Icon(Icons.content_copy, size: 16, color: primaryColor),
),
),
],
),
);
}
Widget _buildQQGroupCard(BuildContext context, bool isDark) {
final themeController = Get.find<ThemeController>();
final primaryColor = themeController.currentThemeColor;
return Container(
decoration: BoxDecoration(
color: isDark ? const Color(0xFF2A2A2A) : Colors.white,
borderRadius: BorderRadius.circular(16),
boxShadow: [
BoxShadow(
color: isDark
? Colors.black.withAlpha(30)
: Colors.black.withAlpha(5),
blurRadius: 10,
offset: const Offset(0, 2),
),
],
),
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Padding(
padding: const EdgeInsets.all(16),
child: Row(
children: [
Container(
padding: const EdgeInsets.all(8),
decoration: BoxDecoration(
color: primaryColor.withAlpha(10),
borderRadius: BorderRadius.circular(8),
),
child: Icon(Icons.group, color: primaryColor, size: 20),
),
const SizedBox(width: 12),
Text(
'QQ交流群',
style: TextStyle(
fontSize: 16,
fontWeight: FontWeight.bold,
color: isDark ? Colors.white : Colors.black,
),
),
],
),
),
Divider(height: 1, color: isDark ? Colors.grey[800] : null),
Padding(
padding: const EdgeInsets.all(16),
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Text(
'加入我们的QQ交流群与其他诗词爱好者一起交流',
style: TextStyle(
fontSize: 13,
color: isDark ? Colors.grey[400] : Colors.grey,
),
),
const SizedBox(height: 12),
InkWell(
onTap: () => _copyQQGroupNumber(context),
borderRadius: BorderRadius.circular(8),
child: Container(
width: double.infinity,
padding: const EdgeInsets.all(12),
decoration: BoxDecoration(
color: isDark ? const Color(0xFF3A3A3A) : Colors.grey[50],
borderRadius: BorderRadius.circular(8),
border: Border.all(color: primaryColor.withAlpha(30)),
),
child: Row(
mainAxisAlignment: MainAxisAlignment.center,
children: [
Icon(Icons.content_copy, size: 16, color: primaryColor),
const SizedBox(width: 8),
Text(
'271129018',
style: TextStyle(
fontSize: 14,
fontWeight: FontWeight.w600,
color: primaryColor,
),
),
],
),
),
),
const SizedBox(height: 8),
Text(
'💡 点击群号可复制',
style: TextStyle(
fontSize: 12,
color: isDark ? Colors.grey[500] : Colors.grey[500],
),
),
],
),
),
],
),
);
}
void _copyQQGroupNumber(BuildContext context) {
final themeController = Get.find<ThemeController>();
final primaryColor = themeController.currentThemeColor;
Clipboard.setData(const ClipboardData(text: '271129018'));
Get.snackbar(
'复制成功',
'QQ群号已复制到剪贴板',
duration: const Duration(seconds: 2),
colorText: primaryColor,
snackPosition: SnackPosition.BOTTOM,
borderRadius: 8,
margin: const EdgeInsets.all(16),
icon: Icon(Icons.check_circle, color: primaryColor, size: 20),
);
}
Widget _buildDeveloperCard(BuildContext context, bool isDark) {
final themeController = Get.find<ThemeController>();
final primaryColor = themeController.currentThemeColor;
return Container(
decoration: BoxDecoration(
color: isDark ? const Color(0xFF2A2A2A) : Colors.white,
borderRadius: BorderRadius.circular(16),
boxShadow: [
BoxShadow(
color: isDark
? Colors.black.withAlpha(30)
: Colors.black.withAlpha(5),
blurRadius: 10,
offset: const Offset(0, 2),
),
],
),
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Padding(
padding: const EdgeInsets.all(16),
child: Row(
children: [
Container(
padding: const EdgeInsets.all(8),
decoration: BoxDecoration(
color: primaryColor.withAlpha(10),
borderRadius: BorderRadius.circular(8),
),
child: Icon(Icons.business, color: primaryColor, size: 20),
),
const SizedBox(width: 12),
Text(
'开发者',
style: TextStyle(
fontSize: 16,
fontWeight: FontWeight.bold,
color: isDark ? Colors.white : Colors.black,
),
),
],
),
),
Divider(height: 1, color: isDark ? Colors.grey[800] : null),
Padding(
padding: const EdgeInsets.all(16),
child: Row(
children: [
Container(
width: 50,
height: 50,
decoration: BoxDecoration(
gradient: LinearGradient(
colors: [
primaryColor.withAlpha(10),
primaryColor.withAlpha(5),
],
),
borderRadius: BorderRadius.circular(12),
),
child: const Center(
child: Text('🏢', style: TextStyle(fontSize: 24)),
),
),
const SizedBox(width: 12),
Expanded(
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Text(
'微风暴工作室',
style: TextStyle(
fontSize: 16,
fontWeight: FontWeight.bold,
color: isDark ? Colors.white : Colors.black,
),
),
const SizedBox(height: 4),
Text(
'专注文字文化领域',
style: TextStyle(
fontSize: 13,
color: isDark ? Colors.grey[400] : Colors.grey[600],
),
),
],
),
),
],
),
),
Padding(
padding: const EdgeInsets.symmetric(horizontal: 16, vertical: 8),
child: Row(
children: [
Container(
width: 40,
height: 40,
decoration: BoxDecoration(
gradient: LinearGradient(
colors: [
Colors.blue.withValues(alpha: 0.1),
Colors.blue.withValues(alpha: 0.05),
],
),
borderRadius: BorderRadius.circular(8),
),
child: const Center(
child: Icon(Icons.email, color: Colors.blue, size: 20),
),
),
const SizedBox(width: 12),
Expanded(
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Text(
'商务合作&侵权申诉&联系我们',
style: TextStyle(
fontSize: 14,
fontWeight: FontWeight.w500,
color: isDark ? Colors.white : Colors.black,
),
),
const SizedBox(height: 2),
const Text(
'2821981550@qq.com',
style: TextStyle(
fontSize: 15,
color: Colors.blue,
decoration: TextDecoration.underline,
),
),
],
),
),
],
),
),
Padding(
padding: const EdgeInsets.fromLTRB(16, 8, 16, 16),
child: Row(
children: [
Container(
width: 50,
height: 50,
decoration: BoxDecoration(
gradient: LinearGradient(
colors: [
const Color(0xFF07C160).withValues(alpha: 0.1),
const Color(0xFF07C160).withValues(alpha: 0.05),
],
),
borderRadius: BorderRadius.circular(12),
),
child: const Center(
child: Text('💬', style: TextStyle(fontSize: 24)),
),
),
const SizedBox(width: 12),
Expanded(
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Text(
'微信公众号',
style: TextStyle(
fontSize: 16,
fontWeight: FontWeight.bold,
color: isDark ? Colors.white : Colors.black,
),
),
const SizedBox(height: 4),
Container(
padding: const EdgeInsets.symmetric(
horizontal: 12,
vertical: 6,
),
decoration: BoxDecoration(
color: const Color(0xFF07C160).withValues(alpha: 0.1),
borderRadius: BorderRadius.circular(8),
),
child: Row(
mainAxisSize: MainAxisSize.min,
children: [
const Icon(
Icons.search,
size: 16,
color: Color(0xFF07C160),
),
const SizedBox(width: 6),
const Text(
'微风暴',
style: TextStyle(
fontSize: 14,
fontWeight: FontWeight.w600,
color: Color(0xFF07C160),
),
),
const SizedBox(width: 8),
GestureDetector(
onTap: () {
final themeController =
Get.find<ThemeController>();
final primaryColor =
themeController.currentThemeColor;
Clipboard.setData(
const ClipboardData(text: '微风暴'),
);
Get.snackbar(
'复制成功',
'已复制到剪贴板',
duration: const Duration(seconds: 2),
colorText: primaryColor,
snackPosition: SnackPosition.BOTTOM,
borderRadius: 8,
margin: const EdgeInsets.all(16),
);
},
child: Icon(
Icons.content_copy,
size: 16,
color: const Color(
0xFF07C160,
).withValues(alpha: 0.8),
),
),
],
),
),
],
),
),
],
),
),
],
),
);
}
Widget _buildTeamCard(bool isDark) {
return Container(
decoration: BoxDecoration(
color: isDark ? const Color(0xFF2A2A2A) : Colors.white,
borderRadius: BorderRadius.circular(16),
boxShadow: [
BoxShadow(
color: isDark
? Colors.black.withValues(alpha: 0.3)
: Colors.black.withValues(alpha: 0.05),
blurRadius: 10,
offset: const Offset(0, 2),
),
],
),
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Padding(
padding: const EdgeInsets.all(16),
child: Row(
children: [
Container(
padding: const EdgeInsets.all(8),
decoration: BoxDecoration(
color: Colors.purple.withValues(alpha: 0.1),
borderRadius: BorderRadius.circular(8),
),
child: Icon(Icons.group, color: Colors.purple[700], size: 20),
),
const SizedBox(width: 12),
Text(
'团队信息(Team)',
style: TextStyle(
fontSize: 16,
fontWeight: FontWeight.bold,
color: isDark ? Colors.white : Colors.black,
),
),
],
),
),
_buildTeamMember(
'💻',
'程序设计',
'无书的书🤡',
'尽毕生所学,取天下之诗集,只为逗她一笑',
isDark,
),
_buildTeamMember('🎨', 'UI/UX/Testing', 'Ayk', '姥头乐也疯狂', isDark),
_buildTeamMember('⚙️', '后端', '伯乐不相马', '真的吗,还是做不到吗?', isDark),
_buildTeamMember('🔧', '技术支持', '闲言app', '闲言app原班人马打造', isDark),
],
),
);
}
Widget _buildTeamMember(
String emoji,
String role,
String name,
String signature,
bool isDark,
) {
final themeController = Get.find<ThemeController>();
final primaryColor = themeController.currentThemeColor;
return Padding(
padding: const EdgeInsets.symmetric(horizontal: 16, vertical: 12),
child: Row(
children: [
Container(
width: 44,
height: 44,
decoration: BoxDecoration(
color: isDark ? const Color(0xFF3A3A3A) : Colors.grey[100],
borderRadius: BorderRadius.circular(10),
),
child: Center(
child: Text(emoji, style: const TextStyle(fontSize: 20)),
),
),
const SizedBox(width: 12),
Expanded(
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Row(
children: [
Text(
role,
style: TextStyle(
fontSize: 14,
fontWeight: FontWeight.w600,
color: isDark ? Colors.white : Colors.black,
),
),
const SizedBox(width: 8),
Container(
padding: const EdgeInsets.symmetric(
horizontal: 8,
vertical: 2,
),
decoration: BoxDecoration(
color: primaryColor.withAlpha(10),
borderRadius: BorderRadius.circular(10),
),
child: Text(
name,
style: TextStyle(fontSize: 11, color: primaryColor),
),
),
],
),
const SizedBox(height: 4),
Text(
signature,
style: TextStyle(
fontSize: 12,
color: isDark ? Colors.grey[400] : Colors.grey[600],
),
),
],
),
),
],
),
);
}
Widget _buildIcpCard(BuildContext context, bool isDark) {
final themeController = Get.find<ThemeController>();
final primaryColor = themeController.currentThemeColor;
return Container(
decoration: BoxDecoration(
color: isDark ? const Color(0xFF2A2A2A) : Colors.white,
borderRadius: BorderRadius.circular(16),
boxShadow: [
BoxShadow(
color: isDark
? Colors.black.withValues(alpha: 0.3)
: Colors.black.withValues(alpha: 0.05),
blurRadius: 10,
offset: const Offset(0, 2),
),
],
),
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Padding(
padding: const EdgeInsets.all(16),
child: Row(
children: [
Container(
padding: const EdgeInsets.all(8),
decoration: BoxDecoration(
color: Colors.orange.withValues(alpha: 0.1),
borderRadius: BorderRadius.circular(8),
),
child: Icon(
Icons.verified,
color: Colors.orange[700],
size: 20,
),
),
const SizedBox(width: 12),
Text(
'ICP备案信息',
style: TextStyle(
fontSize: 16,
fontWeight: FontWeight.bold,
color: isDark ? Colors.white : Colors.black,
),
),
],
),
),
Divider(height: 1, color: isDark ? Colors.grey[800] : null),
Padding(
padding: const EdgeInsets.all(16),
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
GestureDetector(
onTap: () {
Clipboard.setData(
const ClipboardData(text: '滇ICP备2022000863号-13'),
);
Get.snackbar(
'复制成功',
'备案号已复制到剪贴板',
duration: const Duration(seconds: 1),
colorText: primaryColor,
);
},
child: Row(
children: [
Expanded(
child: Text(
'滇ICP备2022000863号-15A',
style: TextStyle(
fontSize: 14,
color: isDark ? Colors.grey[300] : Colors.grey[700],
decoration: TextDecoration.underline,
decorationColor: isDark
? Colors.grey[400]
: Colors.grey[600],
),
),
),
Icon(
Icons.copy,
size: 16,
color: isDark ? Colors.grey[400] : Colors.grey[600],
),
],
),
),
const SizedBox(height: 4),
Text(
'APP核准备案号',
style: TextStyle(
fontSize: 13,
color: isDark ? Colors.grey[400] : Colors.grey[600],
),
),
],
),
),
],
),
);
}
Widget _buildBottomIndicator(bool isDark) {
return Container(
padding: const EdgeInsets.symmetric(vertical: 24),
child: Row(
mainAxisAlignment: MainAxisAlignment.center,
children: [
Container(
width: 40,
height: 1,
color: isDark ? Colors.grey[700] : Colors.grey[300],
),
Padding(
padding: const EdgeInsets.symmetric(horizontal: 16),
child: Text(
'到底了',
style: TextStyle(
fontSize: 12,
color: isDark ? Colors.grey[500] : Colors.grey[400],
),
),
),
Container(
width: 40,
height: 1,
color: isDark ? Colors.grey[700] : Colors.grey[300],
),
],
),
);
}
}