import 'package:flutter/material.dart'; import 'package:permission_handler/permission_handler.dart'; import 'package:r_scan_example/scan_dialog.dart'; import 'package:r_scan/src/r_scan_camera.dart'; List? rScanCameras; class RScanCameraDialog extends StatefulWidget { @override _RScanCameraDialogState createState() => _RScanCameraDialogState(); } class _RScanCameraDialogState extends State { late RScanCameraController _controller; bool isFirst = true; void initCamera() async { if (rScanCameras == null || rScanCameras!.length == 0) { final status = await Permission.camera.status; // final result = await Permission.checkPermissionStatus(PermissionGroup.camera); if (status == PermissionStatus.granted) { rScanCameras = await availableRScanCameras(); print('返回可用的相机:${rScanCameras!.join('\n')}'); } else { final result = await [Permission.camera].request(); // final resultMap = await PermissionHandler().requestPermissions([PermissionGroup.camera]); if (result[Permission.camera] == PermissionStatus.granted) { rScanCameras = await availableRScanCameras(); } else { print('相机权限被拒绝,无法使用'); } } } if (rScanCameras != null && rScanCameras!.length > 0) { _controller = RScanCameraController(rScanCameras![0], RScanCameraResolutionPreset.high) ..addListener(() { final result = _controller.result; if (result != null) { if (isFirst) { Navigator.of(context).pop(result); isFirst = false; } } }) ..initialize().then((_) { if (!mounted) { return; } setState(() {}); }); } } @override void initState() { super.initState(); initCamera(); } @override void dispose() { _controller?.dispose(); super.dispose(); } @override Widget build(BuildContext context) { if (rScanCameras == null || rScanCameras!.length == 0) { return Scaffold( body: Container( alignment: Alignment.center, child: Text('not have available camera'), ), ); } if (!_controller.value.isInitialized) { return Container(); } return Scaffold( backgroundColor: Colors.black, body: Stack( children: [ ScanImageView( child: AspectRatio( aspectRatio: _controller.value.aspectRatio, child: RScanCamera(_controller), ), ), Align( alignment: Alignment.bottomCenter, child: FutureBuilder( future: getFlashMode(), builder: _buildFlashBtn, )) ], ), ); } Future getFlashMode() async { bool isOpen = false; try { isOpen = await _controller.getFlashMode(); } catch (_) {} return isOpen; } Widget _buildFlashBtn(BuildContext context, AsyncSnapshot snapshot) { return snapshot.hasData ? Padding( padding: EdgeInsets.only(bottom: 24 + MediaQuery.of(context).padding.bottom), child: IconButton( icon: Icon(snapshot.data! ? Icons.flash_on : Icons.flash_off), color: Colors.white, iconSize: 46, onPressed: () { if (snapshot.data!) { _controller.setFlashMode(false); } else { _controller.setFlashMode(true); } setState(() {}); }), ) : Container(); } }