小工具知识网

当前位置: 首页 > 行业知识 > flutter使用qr

行业知识

flutter使用qr

2026-11-08 19:55:43 来源:互联网转载

qr_code_scanner仓库地址:qr_code_scanner | Flutter Package

需要添加android和ios的相机权限和本地相册权限:

android中添加权限:

在android\app\build.gradle中修改:minSdkVersion 20

并且在android/app/src/main/AndroidManifest.xml中添加权限:

                

ios添加权限

在ios/Runner/Info.plist中添加权限 

NSCameraUsageDescriptionYour Descriptionio.flutter.embedded_views_previewYES

运行demo

import 'dart:developer';import 'dart:io';import 'package:flutter/foundation.dart';import 'package:flutter/material.dart';import 'package:qr_code_scanner/qr_code_scanner.dart';void main() => runApp(const MaterialApp(home: MyHome()));class MyHome extends StatelessWidget {  const MyHome({Key? key}) : super(key: key);  @override  Widget build(BuildContext context) {    return Scaffold(      appBar: AppBar(title: const Text('Flutter Demo Home Page')),      body: Center(        child: ElevatedButton(          onPressed: () {            Navigator.of(context).push(MaterialPageRoute(              builder: (context) => const QRViewExample(),            ));          },          child: const Text('qrView'),        ),      ),    );  }}class QRViewExample extends StatefulWidget {  const QRViewExample({Key? key}) : super(key: key);  @override  State createState() => _QRViewExampleState();}class _QRViewExampleState extends State {  Barcode? result;  QRViewController? controller;  final GlobalKey qrKey = GlobalKey(debugLabel: 'QR');  // In order to get hot reload to work we need to pause the camera if the platform  // is android, or resume the camera if the platform is iOS.  @override  void reassemble() {    super.reassemble();    if (Platform.isAndroid) {      controller!.pauseCamera();    }    controller!.resumeCamera();  }  @override  Widget build(BuildContext context) {    return Scaffold(      body: Column(        children: [          Expanded(flex: 4, child: _buildQrView(context)),          Expanded(            flex: 1,            child: FittedBox(              fit: BoxFit.contain,              child: Column(                mainAxisAlignment: MainAxisAlignment.spaceEvenly,                children: [                  if (result != null)                    Text(                        'Barcode Type: ${describeEnum(result!.format)}   Data: ${result!.code}')                  else                    const Text('Scan a code'),                  Row(                    mainAxisAlignment: MainAxisAlignment.center,                    crossAxisAlignment: CrossAxisAlignment.center,                    children: [                      Container(                        margin: const EdgeInsets.all(8),                        child: ElevatedButton(                            onPressed: () async {                              await controller?.toggleFlash();                              setState(() {});                            },                            child: FutureBuilder(                              future: controller?.getFlashStatus(),                              builder: (context, snapshot) {                                return Text('Flash: ${snapshot.data}');                              },                            )),                      ),                      Container(                        margin: const EdgeInsets.all(8),                        child: ElevatedButton(                            onPressed: () async {                              await controller?.flipCamera();                              setState(() {});                            },                            child: FutureBuilder(                              future: controller?.getCameraInfo(),                              builder: (context, snapshot) {                                if (snapshot.data != null) {                                  return Text(                                      'Camera facing ${describeEnum(snapshot.data!)}');                                } else {                                  return const Text('loading');                                }                              },                            )),                      )                    ],                  ),                  Row(                    mainAxisAlignment: MainAxisAlignment.center,                    crossAxisAlignment: CrossAxisAlignment.center,                    children: [                      Container(                        margin: const EdgeInsets.all(8),                        child: ElevatedButton(                          onPressed: () async {                            await controller?.pauseCamera();                          },                          child: const Text('pause',                              style: TextStyle(fontSize: 20)),                        ),                      ),                      Container(                        margin: const EdgeInsets.all(8),                        child: ElevatedButton(                          onPressed: () async {                            await controller?.resumeCamera();                          },                          child: const Text('resume',                              style: TextStyle(fontSize: 20)),                        ),                      )                    ],                  ),                ],              ),            ),          )        ],      ),    );  }  Widget _buildQrView(BuildContext context) {    // For this example we check how width or tall the device is and change the scanArea and overlay accordingly.    var scanArea = (MediaQuery.of(context).size.width  _onPermissionSet(context, ctrl, p),    );  }  void _onQRViewCreated(QRViewController controller) {    setState(() {      this.controller = controller;    });    controller.scannedDataStream.listen((scanData) {      setState(() {        result = scanData;      });    });  }  void _onPermissionSet(BuildContext context, QRViewController ctrl, bool p) {    log('${DateTime.now().toIso8601String()}_onPermissionSet $p');    if (!p) {      ScaffoldMessenger.of(context).showSnackBar(        const SnackBar(content: Text('no Permission')),      );    }  }  @override  void dispose() {    controller?.dispose();    super.dispose();  }}

最后实现的效果:

上一篇:怎么找回域名和密码?

下一篇:媒体服务器耗电怎么样?