diff --git a/lib/pages/home/scan_page.dart b/lib/pages/home/scan_page.dart index 8050ac3..78fd144 100644 --- a/lib/pages/home/scan_page.dart +++ b/lib/pages/home/scan_page.dart @@ -30,14 +30,20 @@ class ScanPage extends StatefulWidget { class _ScanPageState extends State { final MobileScannerController _controller = MobileScannerController(); bool _torchOn = false; + bool _hasPermission = true; // 默认有权限 @override void initState() { super.initState(); + + // 监听 controller 的状态变化 + _controller.addListener(_onControllerStateChange); + } @override void dispose() { + _controller.removeListener(_onControllerStateChange); // 移除监听 _controller.dispose(); super.dispose(); } @@ -72,6 +78,27 @@ class _ScanPageState extends State { } + + // 监听权限状态变化 + void _onControllerStateChange() { + final error = _controller.value.error; + + if (error != null && mounted) { + // 检查是否是权限被拒绝的错误 + if (error.errorCode == MobileScannerErrorCode.permissionDenied) { + setState(() { + _hasPermission = false; + }); + print('相机权限被拒绝'); + } + } else if (_controller.value.isRunning && mounted) { + // 如果相机正在运行,说明有权限 + setState(() { + _hasPermission = true; + }); + } + } + // 人脸识别跳转 void goToFace(Map stuInfo) async { print('navigate to face with $stuInfo'); @@ -234,6 +261,33 @@ class _ScanPageState extends State { }, ), ), + + + // 权限遮罩 - 放在最上层覆盖所有内容 + if (!_hasPermission) + Container( + color: Colors.black, + child: const Center( + child: Column( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + Icon(Icons.camera_alt, color: Colors.white, size: 64), + SizedBox(height: 20), + Text( + '需要相机权限才能使用扫码功能', + style: TextStyle(color: Colors.white, fontSize: 16), + ), + SizedBox(height: 10), + Text( + '请在设置中允许相机权限', + style: TextStyle(color: Colors.white70, fontSize: 14), + ), + ], + ), + ), + ), + + ], ), );