zhanghengSmallTechnology a390368922 Merge branch 'master' of https://git.luojigou.vip/luojigou_app/r_scan 4 anni fa
..
android 635db96fda first commit 4 anni fa
images 635db96fda first commit 4 anni fa
ios f53de5129c fix bug 4 anni fa
lib 635db96fda first commit 4 anni fa
test 635db96fda first commit 4 anni fa
.flutter-plugins-dependencies f53de5129c fix bug 4 anni fa
.gitignore 635db96fda first commit 4 anni fa
.metadata 635db96fda first commit 4 anni fa
README.md 635db96fda first commit 4 anni fa
pubspec.lock f0224abdef change version code 4 anni fa
pubspec.yaml 635db96fda first commit 4 anni fa

README.md

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<RScanDialog> {
  RScanController _controller;

  @override
  void initState() {
    super.initState();
    initController();
  }
  bool isFirst=true;


  Future<void> 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<bool>(
          future: canOpenCameraView(),
          builder: (BuildContext context, AsyncSnapshot<bool> snapshot) {
            if (snapshot.hasData && snapshot.data == true) {
              return Stack(
                children: <Widget>[
                  ScanImageView(
                    child: RScanView(
                      controller: _controller,
                    ),
                  ),
                  Positioned(
                      top: 16,
                      right: 16,
                      child: FutureBuilder(future: getFlashMode(),builder: _buildFlashBtn,))
                ],
              );
            } else {
              return Container();
            }
          },
        ),
      ),
    );
  }

  Future<bool> getFlashMode()async{
    bool isOpen = false;
    try{
      isOpen = await _controller.getFlashMode();

    }catch(_){

    }
    return isOpen;
  }

  Future<bool> 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<bool> 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<ScanImageView>
    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,
            ));
  }
}