qrcode_withlogo.dart 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101
  1. import 'dart:async';
  2. import 'dart:html';
  3. import 'dart:ui' as ui;
  4. import 'package:fis_lib_qrtest/custom_qrcode_builder.dart';
  5. import 'package:flutter/material.dart';
  6. import 'package:flutter/services.dart';
  7. // ignore: directives_ordering
  8. import 'package:fis_lib_qrcode/qr_flutter.dart';
  9. import 'package:fis_ui/index.dart';
  10. import 'package:flutter/services.dart';
  11. /// 带logo的二维码
  12. class QRCodeWithLogo extends StatefulWidget implements FWidget {
  13. final String qrData;
  14. final String? codeStatement;
  15. final String? operationStatement;
  16. final void Function()? operationSuccessCallback;
  17. QRCodeWithLogo(
  18. this.qrData, {
  19. this.codeStatement = "QRCodeStatement",
  20. this.operationStatement = "QRCodeOperationStatement",
  21. this.operationSuccessCallback = null,
  22. });
  23. @override
  24. _QRCodeWithLogoState createState() => _QRCodeWithLogoState();
  25. }
  26. class _QRCodeWithLogoState extends State<QRCodeWithLogo> {
  27. @override
  28. Widget build(BuildContext context) {
  29. final qrFutureBuilder = CustomFutureBuilder<ui.Image>(
  30. future: _loadOverlayImage(),
  31. builder: (ctx, snapshot) {
  32. final size = 280.0;
  33. if (!snapshot.hasData) {
  34. return Container(width: size, height: size);
  35. }
  36. return CustomPaint(
  37. size: Size.square(size),
  38. painter: QrPainter(
  39. data: widget.qrData,
  40. version: QrVersions.auto,
  41. eyeStyle: const QrEyeStyle(
  42. eyeShape: QrEyeShape.square,
  43. color: Colors.black,
  44. ),
  45. dataModuleStyle: const QrDataModuleStyle(
  46. dataModuleShape: QrDataModuleShape.square,
  47. color: Colors.black,
  48. ),
  49. // size: 320.0,
  50. embeddedImage: snapshot.data,
  51. embeddedImageStyle: QrEmbeddedImageStyle(
  52. size: Size.square(60),
  53. ),
  54. ),
  55. );
  56. },
  57. );
  58. return Material(
  59. color: Colors.white,
  60. child: FContainer(
  61. width: 160,
  62. child: FColumn(
  63. mainAxisAlignment: MainAxisAlignment.center,
  64. children: [
  65. qrFutureBuilder,
  66. FPadding(
  67. padding: EdgeInsets.symmetric(vertical: 20, horizontal: 40)
  68. .copyWith(bottom: 5),
  69. child: FText(widget.codeStatement!),
  70. ),
  71. FInk(
  72. decoration: UnderlineTabIndicator(
  73. borderSide: BorderSide(color: Colors.blue),
  74. insets: EdgeInsets.fromLTRB(0, 0, 0, 1)),
  75. child: FInkWell(
  76. child: FText(
  77. widget.operationStatement!,
  78. style: TextStyle(color: Colors.blue),
  79. ),
  80. onTap: () => {
  81. Clipboard.setData(ClipboardData(text: widget.qrData)),
  82. widget.operationSuccessCallback?.call()
  83. }),
  84. )
  85. ],
  86. ),
  87. ),
  88. );
  89. }
  90. Future<ui.Image> _loadOverlayImage() async {
  91. final completer = Completer<ui.Image>();
  92. final byteData = await rootBundle.load('assets/images/4.0x/flyinsono.png');
  93. ui.decodeImageFromList(byteData.buffer.asUint8List(), completer.complete);
  94. return completer.future;
  95. }
  96. }