flutter使用qr_code_scanner扫描二维码
qr_code_scanner仓库地址:qr_code_scanner | Flutter Package
需要添加android和ios的相机权限和本地相册权限:
android中添加权限:
在android\app\build.gradle中修改:minSdkVersion 20
并且在android/app/src/main/AndroidManifest.xml中添加权限:
<uses-featureandroid:name="android.hardware.camera"android:required="false" /><uses-permission android:name="android.permission.CAMERA" /><uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/><uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
ios添加权限
在ios/Runner/Info.plist中添加权限
<key>NSCameraUsageDescription</key>
<string>Your Description</string><key>io.flutter.embedded_views_preview</key>
<string>YES</string>
运行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);@overrideWidget 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);@overrideState<StatefulWidget> createState() => _QRViewExampleState();
}class _QRViewExampleState extends State<QRViewExample> {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.@overridevoid reassemble() {super.reassemble();if (Platform.isAndroid) {controller!.pauseCamera();}controller!.resumeCamera();}@overrideWidget build(BuildContext context) {return Scaffold(body: Column(children: <Widget>[Expanded(flex: 4, child: _buildQrView(context)),Expanded(flex: 1,child: FittedBox(fit: BoxFit.contain,child: Column(mainAxisAlignment: MainAxisAlignment.spaceEvenly,children: <Widget>[if (result != null)Text('Barcode Type: ${describeEnum(result!.format)} Data: ${result!.code}')elseconst Text('Scan a code'),Row(mainAxisAlignment: MainAxisAlignment.center,crossAxisAlignment: CrossAxisAlignment.center,children: <Widget>[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: <Widget>[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 < 400 ||MediaQuery.of(context).size.height < 400)? 150.0: 300.0;// To ensure the Scanner view is properly sizes after rotation// we need to listen for Flutter SizeChanged notification and update controllerreturn QRView(key: qrKey,onQRViewCreated: _onQRViewCreated,overlay: QrScannerOverlayShape(borderColor: Colors.red,borderRadius: 10,borderLength: 30,borderWidth: 10,cutOutSize: scanArea),onPermissionSet: (ctrl, p) => _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')),);}}@overridevoid dispose() {controller?.dispose();super.dispose();}
}
最后实现的效果:
相关文章:

flutter使用qr_code_scanner扫描二维码
qr_code_scanner仓库地址:qr_code_scanner | Flutter Package 需要添加android和ios的相机权限和本地相册权限: android中添加权限: 在android\app\build.gradle中修改:minSdkVersion 20 并且在android/app/src/main/AndroidManifest.xml中…...

黑马Java——集合进阶(List、Set、泛型、树)
一、集合的体系结构 1、单列集合(Collection) 二、Collection集合 1、Collection常见方法 1.1代码实现: import java.util.ArrayList; import java.util.Collection;public class A01_CollectionDemo1 {public static void main(String[] a…...

TS项目实战二:网页计算器
使用ts实现网页计算器工具,实现计算器相关功能,使用tsify进行项目编译,引入Browserify实现web界面中直接使用模块加载服务。 源码下载:点击下载 讲解视频 TS实战项目四:计算器项目创建 TS实战项目五:B…...

MySQL的ACID、死锁、MVCC问题
1 ACID ACID代表原子性(atomicity)、一致性(consistency)、隔离性(isolation)和持久性(durability)。一个确保数据安全的事务处理系统,必须满足这些密切相关的标准。 原…...

Docker 可视化工具
1、Portainer 概念介绍 Portainer是一款轻量级的应用,它提供了图形化界面,用于方便地管理Docker环境,包括单机环境和集群环境。 Portainer分为开源社区版(CE版)和商用版(BE版/EE版)。 Porta…...
【C++】友元:友元函数与友元类
一、友元 友元(friend)是C中的一种特殊关系,用于在类之间共享访问权限。通过将一个函数或类声明为另一个类的友元,我们可以允许友元访问声明类的非公有成员。 二、友元函数 问题:现在尝试去重载operator<<&am…...

linux之wsl2安装远程桌面
0. 安装后的效果 1. wsl中打开terminal并安装库 sudo apt-get purge xrdp sudo apt install -y xrdp sudo apt install -y xfce4 sudo apt install -y xfce4-goodies 2.优化显示 sudo sed -i s/max_bpp32/#max_bpp32\nmax_bpp128/g /etc/xrdp/xrdp.ini sudo sed -i s/xserverbp…...

如何以管理员身份删除node_modules文件
今天拉项目,然后需要安装依赖,但是一直报错,如下: 去搜这个问题会让把node_modules文件先删掉 再去安装依赖。我在删除的过程中会说请以管理员身份来删除。 那么windows如何以管理员身份删除node_modules文件呢? wi…...

【Linux】环境基础开发工具的使用之gdb详解(三)
前言:上一篇文章中我们讲解了Linux下的gcc与g的使用,今天我们将进一步的学习gdb与makefile来帮我们更好的理解与使用基础开发工具。 💖 博主CSDN主页:卫卫卫的个人主页 💞 👉 专栏分类:Linux的深度刨析 👈 …...
SpringBoot源码解读与原理分析(二十四)IOC容器的刷新(五)
文章目录 7.11 初始化所有剩下的单实例bean对象7.11.1 beanFactory.preInstantiateSingletons7.11.2 getBean7.11.2.1 别名的解析处理7.11.2.2 判断是否已注册过7.11.2.3 创建前的检查7.11.2.4 标记准备创建的bean对象7.11.2.5 合并BeanDefinition7.11.2.6 bean对象的创建7.11.…...

最大子数组和
一、题目 给你一个整数数组nums,请你找出一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和。子数组 是数组中的一个连续部分。 示例 1: 输入:nums [-2,1,-3,4,-1,2,1,-5,4] 输出&#…...

Node.js版本管理工具之_Volta
Node.js包管理工具之_Volta 文章目录 Node.js包管理工具之_Volta1. 官网1. 官网介绍2. 特点1. 快( Fast)2. 可靠(Reliable)3. 普遍( Universal) 2. 下载与安装1. 下载2. 安装3. 查看 3. 使用1. 查看已安装的工具包2. 安装指定的node版本3.切换项目中使用的版本 1. 官网 1. 官网…...

Redis 命令大全
文章目录 启动与连接Key(键)相关命令String(字符串)Hash(哈希)List(列表)Set(集合)Sorted Set(有序集合)其他常见命令HyperLogLog&…...

再这么烂下去,离糊就不远了。别让才华被埋没。
♥ 为方便您进行讨论和分享,同时也为能带给您不一样的参与感。请您在阅读本文之前,点击一下“关注”,非常感谢您的支持! 文 |猴哥聊娱乐 编 辑|徐 婷 校 对|侯欢庭 近日,胡歌凭借电视剧《繁花》荣登《环球银幕》二月…...

Unity BuffSystem buff系统
Unity BuffSystem buff系统 一、介绍二、buff系统架构三、架构讲解四、框架使用buff数据Json数据以及工具ShowTypeBuffTypeMountTypeBuffOverlapBuffShutDownTypeBuffCalculateType时间和层数这里也不过多说明了如何给生物添加buff 五、总结 一、介绍 现在基本做游戏都会需要些…...
Android rom定制 修改system分区的容量大小
1、写在前面 系统ROM定制化,预置app太多,会导致系统rom很大,原生系统system分区已经不够用了,要加大系统systemui分区 2.修改system分区的容量大小的核心类 device/mediatekprojects/$project/BoardConfig.mk build/make/core/Makefile3、修改system 分区的容量大小的核…...
速盾:服务器接入免备案CDN节点的好处有哪些
本文将探讨服务器接入免备案CDN节点的好处,包括提高网站的访问速度、增加网站的稳定性和可靠性、降低带宽成本等方面的优势。同时,还将提供一些相关问题的解答,帮助读者更好地了解这一技术。 随着互联网的迅猛发展,网站的访问速度…...

Redisson看门狗机制
一、背景 网上redis分布式锁的工具方法,大都满足互斥、防止死锁的特性,有些工具方法会满足可重入特性。如果只满足上述3种特性会有哪些隐患呢?redis分布式锁无法自动续期,比如,一个锁设置了1分钟超时释放,…...
【Java数据结构】双向 不带头 非循环 链表实现(模拟实现LinkedList类)
LinkedList底层实际上是双向、不带头结点、非循环的链表 链表的分类有八种,常用的有两种:一是单向、不带头结点、非循环的(基本上网上的题型都是这种);二是双向、不带头结点、非循环(LinkedList的底层实现…...

深度学习系列55:深度学习加速技术概述
总体有两个方向:模型优化 / 框架优化 1. 模型优化 1.1 量化 最常见的量化方法为线性量化,权重从float32量化为int8,将输入数据映射在[-128,127]的范围内。在 nvdia gpu,x86、arm 和 部分 AI 芯片平台上,均支持 8bit…...

docker详细操作--未完待续
docker介绍 docker官网: Docker:加速容器应用程序开发 harbor官网:Harbor - Harbor 中文 使用docker加速器: Docker镜像极速下载服务 - 毫秒镜像 是什么 Docker 是一种开源的容器化平台,用于将应用程序及其依赖项(如库、运行时环…...
Java多线程实现之Callable接口深度解析
Java多线程实现之Callable接口深度解析 一、Callable接口概述1.1 接口定义1.2 与Runnable接口的对比1.3 Future接口与FutureTask类 二、Callable接口的基本使用方法2.1 传统方式实现Callable接口2.2 使用Lambda表达式简化Callable实现2.3 使用FutureTask类执行Callable任务 三、…...
在Ubuntu中设置开机自动运行(sudo)指令的指南
在Ubuntu系统中,有时需要在系统启动时自动执行某些命令,特别是需要 sudo权限的指令。为了实现这一功能,可以使用多种方法,包括编写Systemd服务、配置 rc.local文件或使用 cron任务计划。本文将详细介绍这些方法,并提供…...

HBuilderX安装(uni-app和小程序开发)
下载HBuilderX 访问官方网站:https://www.dcloud.io/hbuilderx.html 根据您的操作系统选择合适版本: Windows版(推荐下载标准版) Windows系统安装步骤 运行安装程序: 双击下载的.exe安装文件 如果出现安全提示&…...
反射获取方法和属性
Java反射获取方法 在Java中,反射(Reflection)是一种强大的机制,允许程序在运行时访问和操作类的内部属性和方法。通过反射,可以动态地创建对象、调用方法、改变属性值,这在很多Java框架中如Spring和Hiberna…...
Angular微前端架构:Module Federation + ngx-build-plus (Webpack)
以下是一个完整的 Angular 微前端示例,其中使用的是 Module Federation 和 npx-build-plus 实现了主应用(Shell)与子应用(Remote)的集成。 🛠️ 项目结构 angular-mf/ ├── shell-app/ # 主应用&…...

浪潮交换机配置track检测实现高速公路收费网络主备切换NQA
浪潮交换机track配置 项目背景高速网络拓扑网络情况分析通信线路收费网络路由 收费汇聚交换机相应配置收费汇聚track配置 项目背景 在实施省内一条高速公路时遇到的需求,本次涉及的主要是收费汇聚交换机的配置,浪潮网络设备在高速项目很少,通…...

基于Java+MySQL实现(GUI)客户管理系统
客户资料管理系统的设计与实现 第一章 需求分析 1.1 需求总体介绍 本项目为了方便维护客户信息为了方便维护客户信息,对客户进行统一管理,可以把所有客户信息录入系统,进行维护和统计功能。可通过文件的方式保存相关录入数据,对…...

人工智能(大型语言模型 LLMs)对不同学科的影响以及由此产生的新学习方式
今天是关于AI如何在教学中增强学生的学习体验,我把重要信息标红了。人文学科的价值被低估了 ⬇️ 转型与必要性 人工智能正在深刻地改变教育,这并非炒作,而是已经发生的巨大变革。教育机构和教育者不能忽视它,试图简单地禁止学生使…...

uniapp 开发ios, xcode 提交app store connect 和 testflight内测
uniapp 中配置 配置manifest 文档:manifest.json 应用配置 | uni-app官网 hbuilderx中本地打包 下载IOS最新SDK 开发环境 | uni小程序SDK hbulderx 版本号:4.66 对应的sdk版本 4.66 两者必须一致 本地打包的资源导入到SDK 导入资源 | uni小程序SDK …...