```dart import 'package:flutter/material.dart'; import 'package:permission_handler/permission_handler.dart'; import 'package:r_scan/r_scan.dart'; class RScanDialog extends StatefulWidget { @override _RScanDialogState createState() => _RScanDialogState(); } class _RScanDialogState extends State { RScanController _controller; @override void initState() { super.initState(); initController(); } bool isFirst=true; Future initController() async { _controller = RScanController(); _controller.addListener(() { final result = _controller.result; if (result != null) { if(isFirst){ Navigator.of(context).pop(result); isFirst=false; } } }); } @override Widget build(BuildContext context) { return MaterialApp( home: Scaffold( backgroundColor: Colors.black, body: FutureBuilder( future: canOpenCameraView(), builder: (BuildContext context, AsyncSnapshot snapshot) { if (snapshot.hasData && snapshot.data == true) { return Stack( children: [ ScanImageView( child: RScanView( controller: _controller, ), ), Positioned( top: 16, right: 16, child: FutureBuilder(future: getFlashMode(),builder: _buildFlashBtn,)) ], ); } else { return Container(); } }, ), ), ); } Future getFlashMode()async{ bool isOpen = false; try{ isOpen = await _controller.getFlashMode(); }catch(_){ } return isOpen; } Future canOpenCameraView() async { var status = await PermissionHandler().checkPermissionStatus(PermissionGroup.camera); if (status != PermissionStatus.granted) { var future = await PermissionHandler() .requestPermissions([PermissionGroup.camera]); for (final item in future.entries) { if (item.value != PermissionStatus.granted) { return false; } } } else { return true; } return true; } Widget _buildFlashBtn(BuildContext context, AsyncSnapshot snapshot) { return snapshot.hasData?IconButton(icon: Icon(snapshot.data?Icons.flash_on:Icons.flash_off),color: Colors.white, onPressed: (){ if(snapshot.data){ _controller.setFlashMode(false); }else{ _controller.setFlashMode(true); } setState(() {}); }):Container(); } } class ScanImageView extends StatefulWidget { final Widget child; const ScanImageView({Key key, this.child}) : super(key: key); @override _ScanImageViewState createState() => _ScanImageViewState(); } class _ScanImageViewState extends State with TickerProviderStateMixin { AnimationController controller; @override void initState() { super.initState(); controller = AnimationController( vsync: this, duration: Duration(milliseconds: 1000)); controller.repeat(reverse: true); } @override void dispose() { controller.dispose(); super.dispose(); } @override Widget build(BuildContext context) { return AnimatedBuilder( animation: controller, builder: (BuildContext context, Widget child) => CustomPaint( foregroundPainter: _ScanPainter(controller.value, Colors.white, Colors.green), child: widget.child, willChange: true, )); } } ```