Files
wushu/lib/views/profile/components/pop-menu.dart
2026-04-01 01:34:22 +08:00

184 lines
5.2 KiB
Dart

import 'package:flutter/material.dart';
import 'package:flutter/services.dart';
import 'package:flutter/foundation.dart' show kIsWeb;
import 'package:share_plus/share_plus.dart';
import '../../../constants/app_constants.dart';
import '../../../services/wakelock_service.dart';
import 'dart:io' as io;
class PopMenu extends StatelessWidget {
final VoidCallback? onRefresh;
final VoidCallback? onEdit;
final VoidCallback? onScanQr;
final VoidCallback? onDarkMode;
final VoidCallback? onSettings;
const PopMenu({
super.key,
this.onRefresh,
this.onEdit,
this.onScanQr,
this.onDarkMode,
this.onSettings,
});
static Future<void> shareApp(BuildContext context) async {
try {
const String shareText = '情景诗词App - 一款优雅的诗词学习应用,包含丰富的诗词内容和答题功能';
final result = await Share.shareWithResult(shareText, subject: '情景诗词App');
if (result.status == ShareResultStatus.success) {
if (context.mounted) {
ScaffoldMessenger.of(
context,
).showSnackBar(const SnackBar(content: Text('分享成功!')));
}
}
} catch (e) {
if (context.mounted) {
ScaffoldMessenger.of(
context,
).showSnackBar(const SnackBar(content: Text('该平台暂不支持分享功能')));
}
}
}
static Future<void> toggleScreenWake(BuildContext context) async {
// Web 平台不支持 wakelock_plus
if (kIsWeb) {
if (context.mounted) {
ScaffoldMessenger.of(
context,
).showSnackBar(const SnackBar(content: Text('Web 平台不支持屏幕常亮功能')));
}
return;
}
try {
// 使用 io.Platform 检测平台
final String osName = io.Platform.operatingSystem;
final String osVersion = io.Platform.operatingSystemVersion;
print('Current platform: $osName, version: $osVersion');
// 直接尝试启用屏幕常亮
await WakelockService.instance.enable();
if (context.mounted) {
ScaffoldMessenger.of(
context,
).showSnackBar(const SnackBar(content: Text('屏幕常亮已开启')));
}
} catch (e, stackTrace) {
print('WakelockService error: $e');
print('Stack trace: $stackTrace');
if (context.mounted) {
// 检查错误类型,判断是否是设备不支持
String errorMessage;
if (e.toString().contains('not supported') ||
e.toString().contains('unsupported') ||
e.toString().contains('不支持')) {
errorMessage = '该设备不支持屏幕常亮功能';
} else {
errorMessage = '屏幕常亮功能异常: $e';
}
showDialog(
context: context,
builder: (context) => AlertDialog(
title: const Text('提示'),
content: Text(errorMessage),
actions: [
TextButton(
onPressed: () => Navigator.pop(context),
child: const Text('确定'),
),
],
),
);
}
}
}
static void show(
BuildContext context, {
VoidCallback? onRefresh,
VoidCallback? onEdit,
VoidCallback? onScanQr,
VoidCallback? onDarkMode,
VoidCallback? onSettings,
}) {
showModalBottomSheet(
context: context,
backgroundColor: Colors.transparent,
builder: (context) => PopMenu(
onRefresh: onRefresh,
onEdit: onEdit,
onScanQr: onScanQr,
onDarkMode: onDarkMode,
onSettings: onSettings,
),
);
}
@override
Widget build(BuildContext context) {
return Container(
decoration: const BoxDecoration(
color: Colors.white,
borderRadius: BorderRadius.vertical(top: Radius.circular(20)),
),
child: Column(
mainAxisSize: MainAxisSize.min,
children: [
// 顶部拖拽条
Container(
width: 40,
height: 4,
margin: const EdgeInsets.only(top: 8),
decoration: BoxDecoration(
color: Colors.grey[300]!,
borderRadius: BorderRadius.circular(2),
),
),
// 选项列表
_buildBottomSheetItem(context, '刷新数据', Icons.refresh, onRefresh),
_buildBottomSheetItem(context, '分享软件', Icons.share, () {
shareApp(context);
}),
_buildBottomSheetItem(
context,
'屏幕常亮',
Icons.screen_lock_rotation,
() => toggleScreenWake(context),
),
_buildBottomSheetItem(context, '取消', Icons.settings, onSettings),
const SizedBox(height: 20),
_buildBottomSheetItem(context, '返回桌面', Icons.exit_to_app, () {
SystemNavigator.pop();
}),
],
),
);
}
Widget _buildBottomSheetItem(
BuildContext context,
String title,
IconData icon,
VoidCallback? onTap,
) {
return ListTile(
leading: Icon(icon, color: AppConstants.primaryColor),
title: Text(title),
onTap: () {
Navigator.pop(context);
HapticFeedback.lightImpact();
if (onTap != null) {
onTap();
}
},
);
}
}