Untitled

 avatar
unknown
plain_text
5 months ago
10 kB
6
Indexable
class QRScreen extends StatefulWidget {
  const QRScreen({super.key});

  @override
  State<QRScreen> createState() => _QRScreenState();
}

class _QRScreenState extends State<QRScreen> {
  late MobileScannerController _controller;
  QrCodeResponseModel? scannedData;

  @override
  void initState() {
    super.initState();
    _controller = MobileScannerController(
      torchEnabled: false,
      detectionSpeed: DetectionSpeed.noDuplicates,
    );

    // Listen to updates from the QR code API Rx
    qrCodeApiRx.getAvailableSpecificItem.listen((data) {
      setState(() {
        scannedData = data; // Update the UI with scanned data
      });
    });
  }

  @override
  void dispose() {
    _controller.dispose();
    qrCodeApiRx.dataFetcher.close(); // Dispose the stream
    super.dispose();
  }

  // Triggered when a QR code is detected
  void _onQrCodeDetected(String qrCodeValue) async {
    final id = qrCodeValue; // Use the QR code value as needed
    await qrCodeApiRx.getCheckedSpecificQrCode(id: id);
  }

  void _startScan() {
    print('>>>>>>>>>>>>>>>>>>>>>>>>Tap the scan');
    _controller.start();
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      body: Stack(
        children: [
          AiBarcodeScanner(
            cutOutSize: 230,
            cutOutBottomOffset: 200,
            onDispose: () {
              debugPrint("Barcode scanner disposed!");
            },
            appBarBuilder: (context, controller) => AppBar(
              elevation: 0,
              automaticallyImplyLeading: false,
              backgroundColor: const Color(0XFF2F4C64),
              leading: GestureDetector(
                onTap: (){
                  NavigationService.goBack;
                },
                child: Padding(
                  padding:  EdgeInsets.only(left: 10.w,),
                  child: Container(
                    width: 48.w,
                    decoration: BoxDecoration(
                      image: DecorationImage(image: AssetImage(Assets.icons.qrScreenBackIcon.path))
                    ),
                    child: const Icon(Icons.arrow_back_ios_rounded,color: Colors.white,),
                  ),
                ),
              ),
              title: const Text(
                "Scan QR code",
                style: TextStyle(color: Colors.white),
              ),

            ),
            extendBodyBehindAppBar: false,
            borderColor: Colors.white,
            overlayColor: const Color(0XFF2F4C64),
            hideGalleryIcon: true,
            hideSheetDragHandler: true,
            hideSheetTitle: true,
            hideGalleryButton: true,
            bottomSheetBuilder: null,
            borderRadius: 2,
            borderWidth: 18,
            borderLength: 30,

            controller: _controller,
            onDetect: (BarcodeCapture capture) {
              final String? scannedValue = capture.barcodes.first.rawValue;

              if (scannedValue != null) {
                _onQrCodeDetected(scannedValue);

              }
              debugPrint("Barcode scanned: $scannedValue");
            },

            validator: (value) {
              if (value.barcodes.isEmpty) {
                return false;
              }
              return true;
            },
          ),

          Align(
            alignment: Alignment.bottomCenter,
            child: Positioned(
              bottom: 40,
              child: scanner_result(),
            ),
          ),
        ],
      ),
    );
  }

  Padding scanner_result() {
    return Padding(
      padding:  EdgeInsets.only(left: 25, right: 15,bottom: 60.h),
      child: Container(
        width: 327,
        height: 322,
        decoration: BoxDecoration(
            borderRadius: BorderRadius.circular(20),
          image: DecorationImage(image: AssetImage(Assets.images.qrSectionBg.path))
          ),

        child: Padding(
          padding: const EdgeInsets.symmetric(horizontal: 15, vertical: 10),
          child: Column(
            children: [
              Padding(
                padding:  EdgeInsets.symmetric(vertical:5 ),
                child: ShaderMask(
                  shaderCallback: (bounds) => const LinearGradient(
                    colors: [Colors.blue, Colors.purple, Colors.red],
                    begin: Alignment.topLeft,
                    end: Alignment.bottomRight,
                  ).createShader(Rect.fromLTWH(0, 0, bounds.width, bounds.height)),
                  child: const Text(
                    'Result',
                    style: TextStyle(
                      fontSize: 23,
                      fontWeight: FontWeight.bold,
                      color: Colors.white, // Set the color for fallback
                    ),
                  ),
                ),

              ),
              SizedBox(height: 10.h,),
              Container(
                height: 166,
                width: double.infinity,

                decoration: BoxDecoration(
                  image: DecorationImage(image: AssetImage(Assets.images.qrStatusBg.path)),
                    // color: Colors.white.withOpacity(.2),
                    borderRadius: BorderRadius.circular(25.r)),

                child: Column(
                  children: [
                    SizedBox(height: 15.h,),

                    Row(
                      mainAxisAlignment: MainAxisAlignment.center,
                      children: [
                        RichText(
                          text: TextSpan(
                            text: "STATUS: ",
                            style:  TextStyle(fontSize:20.sp, fontWeight: FontWeight.w600 ,color: Colors.white),
                            children: [
                              TextSpan(
                                  text: scannedData?.status == true ? "OK" : "Not Valid",
                                  style:  TextStyle(fontSize:20, fontWeight: FontWeight.w600 ,color: scannedData?.status == true? Colors.white: const Color(0XFFFF4141)
                                  )),
                            ],
                          ),
                        ),
                        const SizedBox(width: 5,),
                        scannedData?.status == true ? SvgPicture.asset(Assets.icons.okIcon):SizedBox.shrink(),
                      ],
                    ),


                    const Padding(
                      padding:
                      EdgeInsets.symmetric(horizontal: 17, vertical: 12),
                      child: Divider(
                        color: Color(0x72D9D9D9),
                      ),
                    ),

                   scannedData?.status == true?Column(
                      crossAxisAlignment: CrossAxisAlignment.start,
                      children: [
                        RichText(
                          text: TextSpan(
                            text: "Name: ",
                            style: TextStyle(
                                color: Colors.white.withOpacity(.3)),
                            children: [
                              TextSpan(
                                   text: scannedData?.data?.user?.name ?? "Unknown",
                                  style: const TextStyle(fontSize: 14,fontWeight: FontWeight.w400)),
                            ],
                          ),
                        ),

                        const SizedBox(height: 15,),
                        RichText(
                          text: TextSpan(
                            text: "Name: ",
                            style: TextStyle(color: Colors.white.withOpacity(.3),fontWeight:FontWeight.w400,fontSize: 12 ),
                            children: [
                              TextSpan(
                                  text: scannedData?.data?.event?.name ?? "No Event",
                                  style: TextStyle(color: Colors.white.withOpacity(.3),fontWeight:FontWeight.w400,fontSize: 12 )),
                            ],
                          ),
                        ),
                      ],
                    ):
                       Image.asset(Assets.images.crossImage.path)
                  ],
                ),
              ),

              const SizedBox(height: 20,),
               ActionButton(
               onTap: (){
                 _startScan();
               },
                btnNm: "Scan Again ",
                 btnIcon: Assets.icons.qrscanIcon,
              )
            ],
          ),
        ),
      ),
    );
  }
}

class ActionButton extends StatelessWidget {
  const ActionButton({
    super.key,
    required this.btnNm,
    this.width,
    this.height,
    this.onTap, this.btnIcon,
    this.isLoading = false
  });

  final String btnNm;
  final String? btnIcon;
  final double? width;
  final double ? height;
  final VoidCallback? onTap;
  final bool isLoading;

  @override
  Widget build(BuildContext context) {
    return GestureDetector(
      onTap: () {
        if (onTap != null) {
          onTap!();
        }
      },
      child: Container(
        width: width ?? double.infinity,
        height: height ?? 56,
        alignment: Alignment.center,
        decoration: BoxDecoration(
          borderRadius: BorderRadius.circular(12),
          gradient: const LinearGradient(
            begin: Alignment.centerRight,
            end: Alignment.centerLeft,
            colors: [
              Color(0xFFF54650),
              Color(0xFFCD6AD2),
              Color(0xFF38B7FF)
            ],
          ),
        ),
        child: isLoading? const CircularProgressIndicator() : Row(
          mainAxisAlignment: MainAxisAlignment.center,
          children: [
            Text(
              btnNm, style: TextStyle(fontSize: 18.sp,color: Colors.white),
            ),
            const SizedBox(height: 15,),
             if(btnIcon !=null) SvgPicture.asset(btnIcon.toString())
          ],
        ),
      ),
    );
  }
}
Editor is loading...
Leave a Comment