Alexandru Stroescu
Alexandru Stroescu

Reputation: 1167

Platform exception when I open the QRView widget from the qr_code_scanner package

I've copied the example code from the package: https://pub.dev/packages/qr_code_scanner

This is how my QR code scanner looks like:

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();
  }
}

When I open this screen by going to the /QrReader route using navigator.push, the QRView is black and I get the error:


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

What should I do to make it work? Before everything was fine, I updated my project to the latest version of flutter and now I get this error.

Upvotes: 6

Views: 5315

Answers (2)

danihoo94
danihoo94

Reputation: 131

I had the same issue and fixed it by requesting camera permission before showing the QR scanner. I did this using the following library: https://pub.dev/packages/permission_handler/install

I solved it with a method returning camera permission status and requesting it once if missing:

Future<PermissionStatus> _getCameraPermission() async {
    var status = await Permission.camera.status;
    if (!status.isGranted) {
        final result = await Permission.camera.request();
        return result;
    } else {
      return status;
    }
}

Then I call the method before opening the widget as a dialog

PermissionStatus status = await _getCameraPermission();
if (status.isGranted) {
    showDialog(
        context: context, 
        builder: (context) => QrScanDialog(onResult: onResult),
    );
}

Upvotes: 3

Akshit Ostwal
Akshit Ostwal

Reputation: 469

Assuming that this code should work fine as it is given in package example, anyways

You can go back to previous version of flutter

In the Flutter install directory execute

git checkout v1.2.2   (the version you wanted)

Now run

flutter doctor

Or You can just go from a version to another using the new commands

flutter downgrade -> go to the previous

flutter upgrade -> update to the new one

Upvotes: 1

Related Questions