android - 当我从 qr_code_scanner 包打开 QRView 小部件时出现平台异常
问题描述
我已经从包中复制了示例代码:https ://pub.dev/packages/qr_code_scanner
这是我的二维码扫描仪的样子:
import 'package:flutter/material.dart';
'package:qr_code_scanner/qr_code_scanner.dart';
class QrReader extends StatefulWidget {
static final routeName = '/QrReader';
@override
_QrReaderState createState() => _QrReaderState();
}
class _QrReaderState extends State<QrReader> {
final GlobalKey qrKey = GlobalKey(debugLabel: 'QR');
var qrText = "";
QRViewController controller;
@override
void initState() {
super.initState();
}
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text('Scan the QR code'),
),
body: QRView(
key: qrKey,
onQRViewCreated: _onQRViewCreated,
),
);
}
void _onQRViewCreated(QRViewController controller) {
this.controller = controller;
controller.scannedDataStream.listen((scanData) {
setState(() {
qrText = scanData;
});
});
}
@override
void dispose() {
controller?.dispose();
super.dispose();
}
}
当我通过使用 navigator.push 转到 /QrReader 路由打开此屏幕时,QRView 是黑色的,并且出现错误:
E/flutter (30118): [ERROR:flutter/lib/ui/ui_dart_state.cc(177)] Unhandled Exception: PlatformException(error, java.lang.IllegalStateException: Trying to create a platform view of unregistered type: net.touchcapture.qr.flutterqr/qrview
E/flutter (30118): at io.flutter.plugin.platform.PlatformViewsController$1.createVirtualDisplayForPlatformView(PlatformViewsController.java:192)
E/flutter (30118): at io.flutter.embedding.engine.systemchannels.PlatformViewsChannel$1.create(PlatformViewsChannel.java:104)
E/flutter (30118): at io.flutter.embedding.engine.systemchannels.PlatformViewsChannel$1.onMethodCall(PlatformViewsChannel.java:59)
E/flutter (30118): at io.flutter.plugin.common.MethodChannel$IncomingMethodCallHandler.onMessage(MethodChannel.java:233)
E/flutter (30118): at io.flutter.embedding.engine.dart.DartMessenger.handleMessageFromDart(DartMessenger.java:85)
E/flutter (30118): at io.flutter.embedding.engine.FlutterJNI.handlePlatformMessage(FlutterJNI.java:692)
E/flutter (30118): at android.os.MessageQueue.nativePollOnce(Native Method)
E/flutter (30118): at android.os.MessageQueue.next(MessageQueue.java:335)
E/flutter (30118): at android.os.Looper.loop(Looper.java:183)
E/flutter (30118): at android.app.ActivityThread.main(ActivityThread.java:7656)
E/flutter (30118): at java.lang.reflect.Method.invoke(Native Method)
E/flutter (30118): at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:592)
E/flutter (30118): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:947)
E/flutter (30118): , null, null)
[38;5;244mE/flutter (30118): #0 StandardMethodCodec.decodeEnvelope[39;49m
package:flutter/…/services/message_codecs.dart
[38;5;244mE/flutter (30118): #1 MethodChannel._invokeMethod[39;49m
package:flutter/…/services/platform_channel.dart
E/flutter (30118): <asynchronous suspension>
[38;5;244mE/flutter (30118): #2 MethodChannel.invokeMethod[39;49m
package:flutter/…/services/platform_channel.dart
[38;5;244mE/flutter (30118): #3 TextureAndroidViewController._sendCreateMessage[39;49m
package:flutter/…/services/platform_views.dart
[38;5;244mE/flutter (30118): #4 AndroidViewController.create[39;49m
package:flutter/…/services/platform_views.dart
[38;5;244mE/flutter (30118): #5 TextureAndroidViewController.create[39;49m
package:flutter/…/services/platform_views.dart
[38;5;244mE/flutter (30118): #6 TextureAndroidViewController.setSize[39;49m
package:flutter/…/services/platform_views.dart
[38;5;244mE/flutter (30118): #7 RenderAndroidView._sizePlatformView[39;49m
package:flutter/…/rendering/platform_view.dart
[38;5;244mE/flutter (30118): #8 RenderAndroidView.performResize[39;49m
package:flutter/…/rendering/platform_view.dart
[38;5;244mE/flutter (30118): #9 RenderObject.layout[39;49m
package:flutter/…/rendering/object.dart
[38;5;244mE/flutter (30118): #10 RenderProxyBoxMixin.performLayout[39;49m
package:flutter/…/rendering/proxy_box.dart
[38;5;244mE/flutter (30118): #11 RenderObject.layout[39;49m
package:flutter/…/rendering/object.dart
[38;5;244mE/flutter (30118): #12 RenderStack.performLayout[39;49m
package:flutter/…/rendering/stack.dart
[38;5;244mE/flutter (30118): #13 RenderObject.layout[39;49m
package:flutter/…/rendering/object.dart
[38;5;244mE/flutter (30118): #14 MultiChildLayoutDelegate.layoutChild[39;49m
package:flutter/…/rendering/custom_layout.dart
[38;5;244mE/flutter (30118): #15 _ScaffoldLayout.performLayout[39;49m
package:flutter/…/material/scaffold.dart
[38;5;244mE/flutter (30118): #16 MultiChildLayoutDelegate._callPerformLayout[39;49m
package:flutter/…/rendering/custom_layout.dart
[38;5;244mE/flutter (30118): #17 RenderCustomMultiChildLayoutBox.performLayout[39;49m
package:flutter/…/rendering/custom_layout.dart
[38;5;244mE/flutter (30118): #18 RenderObject.layout[39;49m
package:flutter/…/rendering/object.dart
[38;5;244mE/flutter (30118): #19 RenderProxyBoxMixin.performLayout[39;49m
package:flutter/…/rendering/proxy_box.dart
[38;5;244mE/flutter (30118): #20 RenderObject.layout[39;49m
package:flutter/…/rendering/object.dart
[38;5;244mE/flutter (30118): #21 RenderProxyBoxMixin.performLayout[39;49m
package:flutter/…/rendering/proxy_box.dart
[38;5;244mE/flutter (30118): #22 _RenderCustomClip.performLayout[39;49m
package:flutter/…/rendering/proxy_box.dart
[38;5;244mE/flutter (30118): #23 RenderObject.layout[39;49m
package:flutter/…/rendering/object.dart
[38;5;244mE/flutter (30118): #24 RenderProxyBoxMixin.performLayout[39;49m
package:flutter/…/rendering/proxy_box.dart
[38;5;244mE/flutter (30118): #25 RenderObject.layout[39;49m
package:flutter/…/rendering/object.dart
[38;5;244mE/flutter (30118): #26 RenderProxyBoxMixin.performLayout[39;49m
package:flutter/…/rendering/proxy_box.dart
[38;5;244mE/flutter (30118): #27 RenderObject.layout[39;49m
package:flutter/…/rendering/object.dart
[38;5;244mE/flutter (30118): #28 RenderProxyBoxMixin.performLayout[39;49m
package:flutter/…/rendering/proxy_box.dart
[38;5;244mE/flutter (30118): #29 RenderObject.layout[39;49m
package:flutter/…/rendering/object.dart
[38;5;244mE/flutter (30118): #30 RenderProxyBoxMixin.performLayout[39;49m
package:flutter/…/rendering/proxy_box.dart
[38;5;244mE/flutter (30118): #31 RenderObject.layout[39;49m
package:flutter/…/rendering/object.dart
[38;5;244mE/flutter (30118): #32 RenderProxyBoxMixin.performLayout[39;49m
package:flutter/…/rendering/proxy_box.dart
[38;5;244mE/flutter (30118): #33 RenderObject.layout[39;49m
package:flutter/…/rendering/object.dart
[38;5;244mE/flutter (30118): #34 RenderProxyBoxMixin.performLayout[39;49m
package:flutter/…/rendering/proxy_box.dart
[38;5;244mE/flutter (30118): #35 RenderObject.layout[39;49m
package:flutter/…/rendering/object.dart
[38;5;244mE/flutter (30118): #36 RenderProxyBoxMixin.performLayout[39;49m
package:flutter/…/rendering/proxy_box.dart
[38;5;244mE/flutter (30118): #37 RenderObject.layout[39;49m
package:flutter/…/rendering/object.dart
[38;5;244mE/flutter (30118): #38 RenderOffstage.performLayout[39;49m
package:flutter/…/rendering/proxy_box.dart
[38;5;244mE/flutter (30118): #39 RenderObject.layout[39;49m
package:flutter/…/rendering/object.dart
[38;5;244mE/flutter (30118): #40 RenderProxyBoxMixin.performLayout[39;49m
package:flutter/…/rendering/proxy_box.dart
[38;5;244mE/flutter (30118): #41 RenderObject.layout[39;49m
package:flutter/…/rendering/object.dart
[38;5;244mE/flutter (30118): #42 _RenderTheatre.performLayout[39;49m
package:flutter/…/widgets/overlay.dart
[38;5;244mE/flutter (30118): #43 RenderObject._layoutWithoutResize[39;49m
package:flutter/…/rendering/object.dart
[38;5;244mE/flutter (30118): #44 PipelineOwner.flushLayout[39;49m
package:flutter/…/rendering/object.dart
[38;5;244mE/flutter (30118): #45 RendererBinding.drawFrame[39;49m
package:flutter/…/rendering/binding.dart
[38;5;244mE/flutter (30118): #46 WidgetsBinding.drawFrame[39;49m
package:flutter/…/widgets/binding.dart
[38;5;244mE/flutter (30118): #47 RendererBinding._handlePersistentFrameCallback[39;49m
package:flutter/…/rendering/binding.dart
[38;5;244mE/flutter (30118): #48 SchedulerBinding._invokeFrameCallback[39;49m
package:flutter/…/scheduler/binding.dart
[38;5;244mE/flutter (30118): #49 SchedulerBinding.handleDrawFrame[39;49m
package:flutter/…/scheduler/binding.dart
[38;5;244mE/flutter (30118): #50 SchedulerBinding._handleDrawFrame[39;49m
package:flutter/…/scheduler/binding.dart
[38;5;244mE/flutter (30118): #51 _rootRun (dart:async/zone.dart:1190:13)[39;49m
[38;5;244mE/flutter (30118): #52 _CustomZone.run (dart:async/zone.dart:1093:19)[39;49m
[38;5;244mE/flutter (30118): #53 _CustomZone.runGuarded (dart:async/zone.dart:997:7)[39;49m
[38;5;244mE/flutter (30118): #54 _invoke (dart:ui/hooks.dart:251:10)[39;49m
[38;5;244mE/flutter (30118): #55 _drawFrame (dart:ui/hooks.dart:209:3)[39;49m
我应该怎么做才能让它工作?在一切正常之前,我将我的项目更新到了最新版本的颤振,现在我得到了这个错误。
解决方案
我遇到了同样的问题,并通过在显示 QR 扫描仪之前请求相机许可来修复它。我使用以下库做到了这一点:https ://pub.dev/packages/permission_handler/install
我通过返回相机权限状态并在丢失时请求一次的方法解决了它:
Future<PermissionStatus> _getCameraPermission() async {
var status = await Permission.camera.status;
if (!status.isGranted) {
final result = await Permission.camera.request();
return result;
} else {
return status;
}
}
然后我在将小部件作为对话框打开之前调用该方法
PermissionStatus status = await _getCameraPermission();
if (status.isGranted) {
showDialog(
context: context,
builder: (context) => QrScanDialog(onResult: onResult),
);
}
推荐阅读
- python-3.x - 通过 boto3 在 AWS EC2 上运行 python Flask API
- asynchronous - 如何将 Stream 转换为 Future?
- android - Flutter Firebase 和 Android 问题 - 无法初始化。找不到执行最新(2020 年 9 月)迁移指令的 google-services.json
- python - 在 python 的异步函数中要调用的所有参数是什么?
- javascript - 我的机器人无法使用系统分配的托管标识访问 Blob 存储帐户
- swift - 如何修复segue显示灰屏
- jenkins - 如何在 Jenkins Jobs 中运行代码审查工作流程以编写脚本?
- mysql - 在mysql上加入两个不同的Selects创建的两个表
- html - 多个 Eventemitter 发出 html 中调用的同步函数
- php - 使用我的模型调用未定义方法的 codeigniter 错误