123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128 |
- 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<RScanCameraDescription>? rScanCameras;
- class RScanCameraDialog extends StatefulWidget {
- @override
- _RScanCameraDialogState createState() => _RScanCameraDialogState();
- }
- class _RScanCameraDialogState extends State<RScanCameraDialog> {
- 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: <Widget>[
- ScanImageView(
- child: AspectRatio(
- aspectRatio: _controller.value.aspectRatio,
- child: RScanCamera(_controller),
- ),
- ),
- Align(
- alignment: Alignment.bottomCenter,
- child: FutureBuilder(
- future: getFlashMode(),
- builder: _buildFlashBtn,
- ))
- ],
- ),
- );
- }
- Future<bool> getFlashMode() async {
- bool isOpen = false;
- try {
- isOpen = await _controller.getFlashMode();
- } catch (_) {}
- return isOpen;
- }
- Widget _buildFlashBtn(BuildContext context, AsyncSnapshot<bool> 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();
- }
- }
|