首页 > 解决方案 > 当我从 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

我应该怎么做才能让它工作?在一切正常之前,我将我的项目更新到了最新版本的颤振,现在我得到了这个错误。

标签: androidflutterdartqr-codeflutter-dependencies

解决方案


我遇到了同样的问题,并通过在显示 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),
    );
}

推荐阅读