Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
74 changes: 41 additions & 33 deletions interfaces/ur_registry_flutter/example/pubspec.lock
Original file line number Diff line number Diff line change
Expand Up @@ -132,26 +132,26 @@ packages:
dependency: transitive
description:
name: leak_tracker
sha256: "6bb818ecbdffe216e81182c2f0714a2e62b593f4a4f13098713ff1685dfb6ab0"
sha256: "33e2e26bdd85a0112ec15400c8cbffea70d0f9c3407491f672a2fad47915e2de"
url: "https://pub.dev"
source: hosted
version: "10.0.9"
version: "11.0.2"
leak_tracker_flutter_testing:
dependency: transitive
description:
name: leak_tracker_flutter_testing
sha256: f8b613e7e6a13ec79cfdc0e97638fddb3ab848452eff057653abd3edba760573
sha256: "1dbc140bb5a23c75ea9c4811222756104fbcd1a27173f0c34ca01e16bea473c1"
url: "https://pub.dev"
source: hosted
version: "3.0.9"
version: "3.0.10"
leak_tracker_testing:
dependency: transitive
description:
name: leak_tracker_testing
sha256: "6ba465d5d76e67ddf503e1161d1f4a6bc42306f9d66ca1e8f079a47290fb06d3"
sha256: "8d5a2d49f4a66b49744b23b018848400d23e54caf9463f4eb20df3eb8acb2eb1"
url: "https://pub.dev"
source: hosted
version: "3.0.1"
version: "3.0.2"
lints:
dependency: transitive
description:
Expand Down Expand Up @@ -184,6 +184,14 @@ packages:
url: "https://pub.dev"
source: hosted
version: "1.16.0"
mobile_scanner:
dependency: transitive
description:
name: mobile_scanner
sha256: "0b466a0a8a211b366c2e87f3345715faef9b6011c7147556ad22f37de6ba3173"
url: "https://pub.dev"
source: hosted
version: "6.0.11"
nested:
dependency: transitive
description:
Expand All @@ -200,38 +208,38 @@ packages:
url: "https://pub.dev"
source: hosted
version: "1.9.1"
provider:
plugin_platform_interface:
dependency: transitive
description:
name: provider
sha256: "4abbd070a04e9ddc287673bf5a030c7ca8b685ff70218720abab8b092f53dd84"
name: plugin_platform_interface
sha256: "4820fbfdb9478b1ebae27888254d445073732dae3d6ea81f0b7e06d5dedc3f02"
url: "https://pub.dev"
source: hosted
version: "6.1.5"
qr:
version: "2.1.8"
pretty_qr_code:
dependency: transitive
description:
name: qr
sha256: "5a1d2586170e172b8a8c8470bbbffd5eb0cd38a66c0d77155ea138d3af3a4445"
name: pretty_qr_code
sha256: cbdb4af29da1c1fa21dd76f809646c591320ab9e435d3b0eab867492d43607d5
url: "https://pub.dev"
source: hosted
version: "3.0.2"
qr_code_scanner_plus:
version: "3.3.0"
provider:
dependency: transitive
description:
name: qr_code_scanner_plus
sha256: "39696b50d277097ee4d90d4292de36f38c66213a4f5216a06b2bdd2b63117859"
name: provider
sha256: "4abbd070a04e9ddc287673bf5a030c7ca8b685ff70218720abab8b092f53dd84"
url: "https://pub.dev"
source: hosted
version: "2.0.10+1"
qr_flutter:
version: "6.1.5"
qr:
dependency: transitive
description:
name: qr_flutter
sha256: "5095f0fc6e3f71d08adef8feccc8cea4f12eec18a2e31c2e8d82cb6019f4b097"
name: qr
sha256: "64957a3930367bf97cc211a5af99551d630f2f4625e38af10edd6b19131b64b3"
url: "https://pub.dev"
source: hosted
version: "4.1.0"
version: "3.0.1"
sky_engine:
dependency: transitive
description: flutter
Expand Down Expand Up @@ -289,10 +297,10 @@ packages:
dependency: transitive
description:
name: test_api
sha256: fb31f383e2ee25fbbfe06b40fe21e1e458d14080e3c67e7ba0acfde4df4e0bbd
sha256: "522f00f556e73044315fa4585ec3270f1808a4b186c936e612cab0b565ff1e00"
url: "https://pub.dev"
source: hosted
version: "0.7.4"
version: "0.7.6"
typed_data:
dependency: transitive
description:
Expand All @@ -307,31 +315,31 @@ packages:
path: ".."
relative: true
source: path
version: "0.3.4"
version: "0.4.1"
uuid:
dependency: transitive
description:
name: uuid
sha256: a5be9ef6618a7ac1e964353ef476418026db906c4facdedaa299b7a2e71690ff
sha256: cd210a09f7c18cbe5a02511718e0334de6559871052c90a90c0cca46a4aa81c8
url: "https://pub.dev"
source: hosted
version: "4.5.1"
version: "4.3.3"
vector_math:
dependency: transitive
description:
name: vector_math
sha256: "80b3257d1492ce4d091729e3a67a60407d227c27241d6927be0130c98e741803"
sha256: d530bd74fea330e6e364cda7a85019c434070188383e1cd8d9777ee586914c5b
url: "https://pub.dev"
source: hosted
version: "2.1.4"
version: "2.2.0"
vm_service:
dependency: transitive
description:
name: vm_service
sha256: ddfa8d30d89985b96407efce8acbdd124701f96741f2d981ca860662f1c0dc02
sha256: "3923c89304b715fb1eb6423f017651664a03bf5f4b29983627c4da791f74a4ec"
url: "https://pub.dev"
source: hosted
version: "15.0.0"
version: "14.2.1"
web:
dependency: transitive
description:
Expand All @@ -341,5 +349,5 @@ packages:
source: hosted
version: "1.1.1"
sdks:
dart: ">=3.7.0 <4.0.0"
flutter: ">=3.19.0"
dart: ">=3.8.0-0 <4.0.0"
flutter: ">=3.22.0"
39 changes: 16 additions & 23 deletions interfaces/ur_registry_flutter/lib/components/animated_qr_code.dart
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@ import 'dart:async';

import 'package:flutter/cupertino.dart';
import 'package:flutter_bloc/flutter_bloc.dart';
import 'package:qr_flutter/qr_flutter.dart';
import 'package:pretty_qr_code/pretty_qr_code.dart';
import 'package:ur_registry_flutter/ur_encoder.dart';

abstract class _State {}
Expand All @@ -11,17 +11,18 @@ class _InitialState extends _State {}

class _AnimatedQRDataState extends _State {
final String data;

_AnimatedQRDataState(this.data);
}

class _Cubit extends Cubit<_State> {
final UREncoder urEncoder;
final AnimatedQRCodeStyle style;
final PrettyQrDecoration? decoration;

late String _currentQR;
late Timer timer;

_Cubit(this.urEncoder, this.style) : super(_InitialState());
_Cubit(this.urEncoder, this.decoration) : super(_InitialState());

void initial() {
_currentQR = urEncoder.nextPart();
Expand All @@ -35,32 +36,26 @@ class _Cubit extends Cubit<_State> {
@override
Future<void> close() async {
timer.cancel();
await super.close();
super.close();
}

String get currentQR => _currentQR;
}

class AnimatedQRCodeStyle {
final double size;

AnimatedQRCodeStyle({
this.size = 200,
});

const AnimatedQRCodeStyle.factory() : size = 200;
}

class AnimatedQRCode extends StatelessWidget {
final UREncoder urEncoder;
final AnimatedQRCodeStyle style;
final PrettyQrDecoration? decoration;

const AnimatedQRCode({super.key, required this.urEncoder, this.style = const AnimatedQRCodeStyle.factory()});
const AnimatedQRCode({
super.key,
required this.urEncoder,
this.decoration,
});

@override
Widget build(BuildContext context) {
return BlocProvider(
create: (BuildContext context) => _Cubit(urEncoder, style),
create: (BuildContext context) => _Cubit(urEncoder, decoration),
child: const _AnimatedQRCode(),
);
}
Expand Down Expand Up @@ -89,16 +84,14 @@ class _AnimatedQRCodeState extends State<_AnimatedQRCode> {
Widget build(BuildContext context) {
return BlocBuilder<_Cubit, _State>(builder: (context, state) {
if (state is _AnimatedQRDataState) {
return QrImageView(
return PrettyQrView.data(
data: state.data,
size: _cubit.style.size,
backgroundColor: const Color(0xFFFFFFFF),
decoration: _cubit.decoration,
);
}
return QrImageView(
return PrettyQrView.data(
data: _cubit.currentQR,
size: _cubit.style.size,
backgroundColor: const Color(0xFFFFFFFF),
decoration: _cubit.decoration,
);
});
}
Expand Down
Original file line number Diff line number Diff line change
@@ -1,8 +1,7 @@
import 'dart:io';
import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart';
import 'package:flutter_bloc/flutter_bloc.dart';
import 'package:qr_code_scanner_plus/qr_code_scanner_plus.dart';
import 'package:mobile_scanner/mobile_scanner.dart';
import 'package:ur_registry_flutter/native_object.dart';
import 'package:ur_registry_flutter/ur_decoder.dart';

Expand All @@ -17,8 +16,7 @@ class _Cubit extends Cubit<_State> {
late final SupportedType target;
final SuccessCallback onSuccess;
final FailureCallback onFailed;
// final OnProcessed? onProcessed;
final QrScannerOverlayShape? overlay;
final Widget? overlay;
URDecoder urDecoder = URDecoder();
bool succeed = false;

Expand Down Expand Up @@ -57,20 +55,20 @@ class AnimatedQRScanner extends StatelessWidget {
final SupportedType target;
final SuccessCallback onSuccess;
final FailureCallback onFailed;
final QrScannerOverlayShape? overlay;
final Widget? overlay;

const AnimatedQRScanner({
super.key,
required this.target,
required this.onSuccess,
required this.onFailed,
this.overlay,
});
const AnimatedQRScanner(
{super.key,
required this.target,
required this.onSuccess,
required this.onFailed,
this.overlay});

@override
Widget build(BuildContext context) {
return BlocProvider(
create: (BuildContext context) => _Cubit(target, onSuccess, onFailed, overlay: overlay),
create: (BuildContext context) =>
_Cubit(target, onSuccess, onFailed, overlay: overlay),
child: _AnimatedQRScanner(),
);
}
Expand All @@ -82,8 +80,8 @@ class _AnimatedQRScanner extends StatefulWidget {
}

class _AnimatedQRScannerState extends State<_AnimatedQRScanner> {
final GlobalKey<State<StatefulWidget>> keyQr = GlobalKey(debugLabel: 'QR');
QRViewController? controller;
final MobileScannerController controller =
MobileScannerController(detectionSpeed: DetectionSpeed.noDuplicates);
late final _Cubit _cubit;

@override
Expand All @@ -92,37 +90,23 @@ class _AnimatedQRScannerState extends State<_AnimatedQRScanner> {
super.initState();
}

@override
Future<void> reassemble() async {
if (Platform.isAndroid) {
await controller!.pauseCamera();
}
controller!.resumeCamera();
super.reassemble();
}

@override
Widget build(BuildContext context) {
return QRView(
key: keyQr,
onQRViewCreated: onQRViewCreated,
overlay: _cubit.overlay,
return MobileScanner(
controller: controller,
overlayBuilder:
_cubit.overlay != null ? (context, _) => _cubit.overlay! : null,
onDetect: (BarcodeCapture capture) {
for (final barcode in capture.barcodes) {
_cubit.receiveQRCode(barcode.rawValue);
}
},
);
}

Future<void> onQRViewCreated(QRViewController controller) async {
setState(() => this.controller = controller);
// The reassemble function call is needed because of the black screen error
// https://github.com/juliuscanute/qr_code_scanner/issues/538#issuecomment-1133883828
// https://github.com/juliuscanute/qr_code_scanner/issues/548
reassemble();
try {
controller.scannedDataStream.listen((event) {
_cubit.receiveQRCode(event.code);
});
} catch (e) {
_cubit.onFailed("Error when receiving UR: $e");
_cubit.reset();
}
@override
void dispose() {
controller.dispose();
super.dispose();
}
}
6 changes: 4 additions & 2 deletions interfaces/ur_registry_flutter/pubspec.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -13,8 +13,10 @@ dependencies:
flutter:
sdk: flutter
flutter_bloc: ^9.0.0
qr_code_scanner_plus: ^2.0.3
qr_flutter: ^4.1.0
mobile_scanner: ^6.0.0
pretty_qr_code: ^3.3.0
# qr_code_scanner_plus: ^2.0.3
# qr_flutter: ^4.1.0
uuid: ^4.1.0

dev_dependencies:
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -22,13 +22,13 @@ void main() {
TestWidgetsFlutterBinding.ensureInitialized();

setUp(() {
channel.setMockMethodCallHandler((MethodCall methodCall) async {
TestDefaultBinaryMessengerBinding.instance.defaultBinaryMessenger.setMockMethodCallHandler(channel, (MethodCall methodCall) async {
return '42';
});
});

tearDown(() {
channel.setMockMethodCallHandler(null);
TestDefaultBinaryMessengerBinding.instance.defaultBinaryMessenger.setMockMethodCallHandler(channel, null);
});

test('getPlatformVersion', () async {
Expand Down