mirror of
https://github.com/theyakka/qr.flutter.git
synced 2025-08-06 10:29:33 +08:00
fix code warnings
This commit is contained in:
@ -80,7 +80,6 @@ linter:
|
|||||||
# libraries
|
# libraries
|
||||||
# classes
|
# classes
|
||||||
- one_member_abstracts # avoid
|
- one_member_abstracts # avoid
|
||||||
- avoid_classes_with_only_static_members # avoid
|
|
||||||
- public_member_api_docs
|
- public_member_api_docs
|
||||||
# constructors
|
# constructors
|
||||||
- prefer_constructors_over_static_methods
|
- prefer_constructors_over_static_methods
|
||||||
|
@ -13,7 +13,7 @@ import 'qr_versions.dart';
|
|||||||
class QrUnsupportedVersionException implements Exception {
|
class QrUnsupportedVersionException implements Exception {
|
||||||
/// Create a new QrUnsupportedVersionException.
|
/// Create a new QrUnsupportedVersionException.
|
||||||
factory QrUnsupportedVersionException(int providedVersion) {
|
factory QrUnsupportedVersionException(int providedVersion) {
|
||||||
final String message =
|
final message =
|
||||||
'Invalid version. $providedVersion is not >= ${QrVersions.min} '
|
'Invalid version. $providedVersion is not >= ${QrVersions.min} '
|
||||||
'and <= ${QrVersions.max}';
|
'and <= ${QrVersions.max}';
|
||||||
return QrUnsupportedVersionException._internal(providedVersion, message);
|
return QrUnsupportedVersionException._internal(providedVersion, message);
|
||||||
|
@ -8,12 +8,14 @@ import 'package:flutter/widgets.dart';
|
|||||||
|
|
||||||
import 'types.dart';
|
import 'types.dart';
|
||||||
|
|
||||||
|
/// Caches painter objects so we do have to recreate them and waste expensive
|
||||||
|
/// cycles.
|
||||||
class PaintCache {
|
class PaintCache {
|
||||||
final List<Paint> _pixelPaints = <Paint>[];
|
final List<Paint> _pixelPaints = <Paint>[];
|
||||||
final Map<String, Paint> _keyedPaints = <String, Paint>{};
|
final Map<String, Paint> _keyedPaints = <String, Paint>{};
|
||||||
|
|
||||||
String _cacheKey(QrCodeElement element, {FinderPatternPosition? position}) {
|
String _cacheKey(QrCodeElement element, {FinderPatternPosition? position}) {
|
||||||
final String posKey = position != null ? position.toString() : 'any';
|
final posKey = position != null ? position.toString() : 'any';
|
||||||
return '$element:$posKey';
|
return '$element:$posKey';
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -178,20 +178,20 @@ class _QrImageViewState extends State<QrImageView> {
|
|||||||
QrValidationResult(status: QrValidationStatus.valid, qrCode: _qr);
|
QrValidationResult(status: QrValidationStatus.valid, qrCode: _qr);
|
||||||
}
|
}
|
||||||
return LayoutBuilder(
|
return LayoutBuilder(
|
||||||
builder: (BuildContext context, BoxConstraints constraints) {
|
builder: (context, constraints) {
|
||||||
// validation failed, show an error state widget if builder is present.
|
// validation failed, show an error state widget if builder is present.
|
||||||
if (!_validationResult.isValid) {
|
if (!_validationResult.isValid) {
|
||||||
return _errorWidget(context, constraints, _validationResult.error);
|
return _errorWidget(context, constraints, _validationResult.error);
|
||||||
}
|
}
|
||||||
// no error, build the regular widget
|
// no error, build the regular widget
|
||||||
final double widgetSize =
|
final widgetSize =
|
||||||
widget.size ?? constraints.biggest.shortestSide;
|
widget.size ?? constraints.biggest.shortestSide;
|
||||||
if (widget.embeddedImage != null) {
|
if (widget.embeddedImage != null) {
|
||||||
// if requesting to embed an image then we need to load via a
|
// if requesting to embed an image then we need to load via a
|
||||||
// FutureBuilder because the image provider will be async.
|
// FutureBuilder because the image provider will be async.
|
||||||
return FutureBuilder<ui.Image>(
|
return FutureBuilder<ui.Image>(
|
||||||
future: _loadQrImage(context, widget.embeddedImageStyle),
|
future: _loadQrImage(context, widget.embeddedImageStyle),
|
||||||
builder: (BuildContext ctx, AsyncSnapshot<ui.Image> snapshot) {
|
builder: (ctx, snapshot) {
|
||||||
if (snapshot.error != null) {
|
if (snapshot.error != null) {
|
||||||
debugPrint('snapshot error: ${snapshot.error}');
|
debugPrint('snapshot error: ${snapshot.error}');
|
||||||
return widget.embeddedImageEmitsError
|
return widget.embeddedImageEmitsError
|
||||||
@ -200,7 +200,7 @@ class _QrImageViewState extends State<QrImageView> {
|
|||||||
}
|
}
|
||||||
if (snapshot.hasData) {
|
if (snapshot.hasData) {
|
||||||
debugPrint('loaded image');
|
debugPrint('loaded image');
|
||||||
final ui.Image? loadedImage = snapshot.data;
|
final loadedImage = snapshot.data;
|
||||||
return _qrWidget(loadedImage, widgetSize);
|
return _qrWidget(loadedImage, widgetSize);
|
||||||
} else {
|
} else {
|
||||||
return Container();
|
return Container();
|
||||||
@ -215,7 +215,7 @@ class _QrImageViewState extends State<QrImageView> {
|
|||||||
}
|
}
|
||||||
|
|
||||||
Widget _qrWidget(ui.Image? image, double edgeLength) {
|
Widget _qrWidget(ui.Image? image, double edgeLength) {
|
||||||
final QrPainter painter = QrPainter.withQr(
|
final painter = QrPainter.withQr(
|
||||||
qr: _qr!,
|
qr: _qr!,
|
||||||
// ignore: deprecated_member_use_from_same_package
|
// ignore: deprecated_member_use_from_same_package
|
||||||
color: widget.foregroundColor,
|
color: widget.foregroundColor,
|
||||||
@ -239,10 +239,10 @@ class _QrImageViewState extends State<QrImageView> {
|
|||||||
BoxConstraints constraints,
|
BoxConstraints constraints,
|
||||||
Object? error,
|
Object? error,
|
||||||
) {
|
) {
|
||||||
final Widget errorWidget = widget.errorStateBuilder == null
|
final errorWidget = widget.errorStateBuilder == null
|
||||||
? Container()
|
? Container()
|
||||||
: widget.errorStateBuilder!(context, error);
|
: widget.errorStateBuilder!(context, error);
|
||||||
final double errorSideLength = widget.constrainErrorBounds
|
final errorSideLength = widget.constrainErrorBounds
|
||||||
? widget.size ?? constraints.biggest.shortestSide
|
? widget.size ?? constraints.biggest.shortestSide
|
||||||
: constraints.biggest.longestSide;
|
: constraints.biggest.longestSide;
|
||||||
return _QrContentView(
|
return _QrContentView(
|
||||||
@ -262,20 +262,20 @@ class _QrImageViewState extends State<QrImageView> {
|
|||||||
) {
|
) {
|
||||||
if (style != null) {}
|
if (style != null) {}
|
||||||
|
|
||||||
final MediaQueryData mq = MediaQuery.of(buildContext);
|
final mq = MediaQuery.of(buildContext);
|
||||||
final Completer<ui.Image> completer = Completer<ui.Image>();
|
final completer = Completer<ui.Image>();
|
||||||
final ImageStream stream = widget.embeddedImage!.resolve(
|
final stream = widget.embeddedImage!.resolve(
|
||||||
ImageConfiguration(
|
ImageConfiguration(
|
||||||
devicePixelRatio: mq.devicePixelRatio,
|
devicePixelRatio: mq.devicePixelRatio,
|
||||||
),
|
),
|
||||||
);
|
);
|
||||||
|
|
||||||
streamListener = ImageStreamListener(
|
streamListener = ImageStreamListener(
|
||||||
(ImageInfo info, bool err) {
|
(info, err) {
|
||||||
stream.removeListener(streamListener);
|
stream.removeListener(streamListener);
|
||||||
completer.complete(info.image);
|
completer.complete(info.image);
|
||||||
},
|
},
|
||||||
onError: (Object err, _) {
|
onError: (err, _) {
|
||||||
stream.removeListener(streamListener);
|
stream.removeListener(streamListener);
|
||||||
completer.completeError(err);
|
completer.completeError(err);
|
||||||
},
|
},
|
||||||
|
@ -138,7 +138,7 @@ class QrPainter extends CustomPainter {
|
|||||||
throw QrUnsupportedVersionException(version);
|
throw QrUnsupportedVersionException(version);
|
||||||
}
|
}
|
||||||
// configure and make the QR code data
|
// configure and make the QR code data
|
||||||
final QrValidationResult validationResult = QrValidator.validate(
|
final validationResult = QrValidator.validate(
|
||||||
data: data,
|
data: data,
|
||||||
version: version,
|
version: version,
|
||||||
errorCorrectionLevel: errorCorrectionLevel,
|
errorCorrectionLevel: errorCorrectionLevel,
|
||||||
@ -168,7 +168,7 @@ class QrPainter extends CustomPainter {
|
|||||||
);
|
);
|
||||||
// Cache the finder pattern painters. We'll keep one for each one in case
|
// Cache the finder pattern painters. We'll keep one for each one in case
|
||||||
// we want to provide customization options later.
|
// we want to provide customization options later.
|
||||||
for (final FinderPatternPosition position in FinderPatternPosition.values) {
|
for (final position in FinderPatternPosition.values) {
|
||||||
_paintCache.cache(
|
_paintCache.cache(
|
||||||
Paint()..style = PaintingStyle.stroke,
|
Paint()..style = PaintingStyle.stroke,
|
||||||
QrCodeElement.finderPatternOuter,
|
QrCodeElement.finderPatternOuter,
|
||||||
@ -197,7 +197,7 @@ class QrPainter extends CustomPainter {
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
final _PaintMetrics paintMetrics = _PaintMetrics(
|
final paintMetrics = _PaintMetrics(
|
||||||
containerSize: size.shortestSide,
|
containerSize: size.shortestSide,
|
||||||
moduleCount: _qr!.moduleCount,
|
moduleCount: _qr!.moduleCount,
|
||||||
gapSize: gapless ? 0 : _gapSize,
|
gapSize: gapless ? 0 : _gapSize,
|
||||||
@ -231,9 +231,9 @@ class QrPainter extends CustomPainter {
|
|||||||
|
|
||||||
double left;
|
double left;
|
||||||
double top;
|
double top;
|
||||||
final num gap = !gapless ? _gapSize : 0;
|
final gap = !gapless ? _gapSize : 0;
|
||||||
// get the painters for the pixel information
|
// get the painters for the pixel information
|
||||||
final ui.Paint? pixelPaint =
|
final pixelPaint =
|
||||||
_paintCache.firstPaint(QrCodeElement.codePixel);
|
_paintCache.firstPaint(QrCodeElement.codePixel);
|
||||||
if (color != null) {
|
if (color != null) {
|
||||||
pixelPaint!.color = color!;
|
pixelPaint!.color = color!;
|
||||||
@ -245,13 +245,13 @@ class QrPainter extends CustomPainter {
|
|||||||
emptyPixelPaint = _paintCache.firstPaint(QrCodeElement.codePixelEmpty);
|
emptyPixelPaint = _paintCache.firstPaint(QrCodeElement.codePixelEmpty);
|
||||||
emptyPixelPaint!.color = emptyColor!;
|
emptyPixelPaint!.color = emptyColor!;
|
||||||
}
|
}
|
||||||
for (int x = 0; x < _qr!.moduleCount; x++) {
|
for (var x = 0; x < _qr!.moduleCount; x++) {
|
||||||
for (int y = 0; y < _qr!.moduleCount; y++) {
|
for (var y = 0; y < _qr!.moduleCount; y++) {
|
||||||
// draw the finder patterns independently
|
// draw the finder patterns independently
|
||||||
if (_isFinderPatternPosition(x, y)) {
|
if (_isFinderPatternPosition(x, y)) {
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
final ui.Paint? paint =
|
final paint =
|
||||||
_qrImage.isDark(y, x) ? pixelPaint : emptyPixelPaint;
|
_qrImage.isDark(y, x) ? pixelPaint : emptyPixelPaint;
|
||||||
if (paint == null) {
|
if (paint == null) {
|
||||||
continue;
|
continue;
|
||||||
@ -259,15 +259,15 @@ class QrPainter extends CustomPainter {
|
|||||||
// paint a pixel
|
// paint a pixel
|
||||||
left = paintMetrics.inset + (x * (paintMetrics.pixelSize + gap));
|
left = paintMetrics.inset + (x * (paintMetrics.pixelSize + gap));
|
||||||
top = paintMetrics.inset + (y * (paintMetrics.pixelSize + gap));
|
top = paintMetrics.inset + (y * (paintMetrics.pixelSize + gap));
|
||||||
double pixelHTweak = 0.0;
|
var pixelHTweak = 0.0;
|
||||||
double pixelVTweak = 0.0;
|
var pixelVTweak = 0.0;
|
||||||
if (gapless && _hasAdjacentHorizontalPixel(x, y, _qr!.moduleCount)) {
|
if (gapless && _hasAdjacentHorizontalPixel(x, y, _qr!.moduleCount)) {
|
||||||
pixelHTweak = 0.5;
|
pixelHTweak = 0.5;
|
||||||
}
|
}
|
||||||
if (gapless && _hasAdjacentVerticalPixel(x, y, _qr!.moduleCount)) {
|
if (gapless && _hasAdjacentVerticalPixel(x, y, _qr!.moduleCount)) {
|
||||||
pixelVTweak = 0.5;
|
pixelVTweak = 0.5;
|
||||||
}
|
}
|
||||||
final ui.Rect squareRect = Rect.fromLTWH(
|
final squareRect = Rect.fromLTWH(
|
||||||
left,
|
left,
|
||||||
top,
|
top,
|
||||||
paintMetrics.pixelSize + pixelHTweak,
|
paintMetrics.pixelSize + pixelHTweak,
|
||||||
@ -276,7 +276,7 @@ class QrPainter extends CustomPainter {
|
|||||||
if (dataModuleStyle.dataModuleShape == QrDataModuleShape.square) {
|
if (dataModuleStyle.dataModuleShape == QrDataModuleShape.square) {
|
||||||
canvas.drawRect(squareRect, paint);
|
canvas.drawRect(squareRect, paint);
|
||||||
} else {
|
} else {
|
||||||
final ui.RRect roundedRect = RRect.fromRectAndRadius(
|
final roundedRect = RRect.fromRectAndRadius(
|
||||||
squareRect,
|
squareRect,
|
||||||
Radius.circular(paintMetrics.pixelSize + pixelHTweak),
|
Radius.circular(paintMetrics.pixelSize + pixelHTweak),
|
||||||
);
|
);
|
||||||
@ -286,15 +286,15 @@ class QrPainter extends CustomPainter {
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (embeddedImage != null) {
|
if (embeddedImage != null) {
|
||||||
final ui.Size originalSize = Size(
|
final originalSize = Size(
|
||||||
embeddedImage!.width.toDouble(),
|
embeddedImage!.width.toDouble(),
|
||||||
embeddedImage!.height.toDouble(),
|
embeddedImage!.height.toDouble(),
|
||||||
);
|
);
|
||||||
final ui.Size? requestedSize =
|
final requestedSize =
|
||||||
embeddedImageStyle != null ? embeddedImageStyle!.size : null;
|
embeddedImageStyle != null ? embeddedImageStyle!.size : null;
|
||||||
final ui.Size imageSize =
|
final imageSize =
|
||||||
_scaledAspectSize(size, originalSize, requestedSize);
|
_scaledAspectSize(size, originalSize, requestedSize);
|
||||||
final ui.Offset position = Offset(
|
final position = Offset(
|
||||||
(size.width - imageSize.width) / 2.0,
|
(size.width - imageSize.width) / 2.0,
|
||||||
(size.height - imageSize.height) / 2.0,
|
(size.height - imageSize.height) / 2.0,
|
||||||
);
|
);
|
||||||
@ -318,10 +318,10 @@ class QrPainter extends CustomPainter {
|
|||||||
}
|
}
|
||||||
|
|
||||||
bool _isFinderPatternPosition(int x, int y) {
|
bool _isFinderPatternPosition(int x, int y) {
|
||||||
final bool isTopLeft = y < _finderPatternLimit && x < _finderPatternLimit;
|
final isTopLeft = y < _finderPatternLimit && x < _finderPatternLimit;
|
||||||
final bool isBottomLeft = y < _finderPatternLimit &&
|
final isBottomLeft = y < _finderPatternLimit &&
|
||||||
(x >= _qr!.moduleCount - _finderPatternLimit);
|
(x >= _qr!.moduleCount - _finderPatternLimit);
|
||||||
final bool isTopRight = y >= _qr!.moduleCount - _finderPatternLimit &&
|
final isTopRight = y >= _qr!.moduleCount - _finderPatternLimit &&
|
||||||
(x < _finderPatternLimit);
|
(x < _finderPatternLimit);
|
||||||
return isTopLeft || isBottomLeft || isTopRight;
|
return isTopLeft || isBottomLeft || isTopRight;
|
||||||
}
|
}
|
||||||
@ -331,12 +331,12 @@ class QrPainter extends CustomPainter {
|
|||||||
Canvas canvas,
|
Canvas canvas,
|
||||||
_PaintMetrics metrics,
|
_PaintMetrics metrics,
|
||||||
) {
|
) {
|
||||||
final double totalGap = (_finderPatternLimit - 1) * metrics.gapSize;
|
final totalGap = (_finderPatternLimit - 1) * metrics.gapSize;
|
||||||
final double radius =
|
final radius =
|
||||||
((_finderPatternLimit * metrics.pixelSize) + totalGap) -
|
((_finderPatternLimit * metrics.pixelSize) + totalGap) -
|
||||||
metrics.pixelSize;
|
metrics.pixelSize;
|
||||||
final double strokeAdjust = metrics.pixelSize / 2.0;
|
final strokeAdjust = metrics.pixelSize / 2.0;
|
||||||
final double edgePos =
|
final edgePos =
|
||||||
(metrics.inset + metrics.innerContentSize) - (radius + strokeAdjust);
|
(metrics.inset + metrics.innerContentSize) - (radius + strokeAdjust);
|
||||||
|
|
||||||
Offset offset;
|
Offset offset;
|
||||||
@ -350,19 +350,19 @@ class QrPainter extends CustomPainter {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// configure the paints
|
// configure the paints
|
||||||
final ui.Paint outerPaint = _paintCache.firstPaint(
|
final outerPaint = _paintCache.firstPaint(
|
||||||
QrCodeElement.finderPatternOuter,
|
QrCodeElement.finderPatternOuter,
|
||||||
position: position,
|
position: position,
|
||||||
)!;
|
)!;
|
||||||
outerPaint.strokeWidth = metrics.pixelSize;
|
outerPaint.strokeWidth = metrics.pixelSize;
|
||||||
outerPaint.color = color != null ? color! : eyeStyle.color!;
|
outerPaint.color = color != null ? color! : eyeStyle.color!;
|
||||||
|
|
||||||
final ui.Paint innerPaint = _paintCache
|
final innerPaint = _paintCache
|
||||||
.firstPaint(QrCodeElement.finderPatternInner, position: position)!;
|
.firstPaint(QrCodeElement.finderPatternInner, position: position)!;
|
||||||
innerPaint.strokeWidth = metrics.pixelSize;
|
innerPaint.strokeWidth = metrics.pixelSize;
|
||||||
innerPaint.color = emptyColor ?? const Color(0x00ffffff);
|
innerPaint.color = emptyColor ?? const Color(0x00ffffff);
|
||||||
|
|
||||||
final ui.Paint? dotPaint = _paintCache.firstPaint(
|
final dotPaint = _paintCache.firstPaint(
|
||||||
QrCodeElement.finderPatternDot,
|
QrCodeElement.finderPatternDot,
|
||||||
position: position,
|
position: position,
|
||||||
);
|
);
|
||||||
@ -372,20 +372,20 @@ class QrPainter extends CustomPainter {
|
|||||||
dotPaint!.color = eyeStyle.color!;
|
dotPaint!.color = eyeStyle.color!;
|
||||||
}
|
}
|
||||||
|
|
||||||
final ui.Rect outerRect =
|
final outerRect =
|
||||||
Rect.fromLTWH(offset.dx, offset.dy, radius, radius);
|
Rect.fromLTWH(offset.dx, offset.dy, radius, radius);
|
||||||
|
|
||||||
final double innerRadius = radius - (2 * metrics.pixelSize);
|
final innerRadius = radius - (2 * metrics.pixelSize);
|
||||||
final ui.Rect innerRect = Rect.fromLTWH(
|
final innerRect = Rect.fromLTWH(
|
||||||
offset.dx + metrics.pixelSize,
|
offset.dx + metrics.pixelSize,
|
||||||
offset.dy + metrics.pixelSize,
|
offset.dy + metrics.pixelSize,
|
||||||
innerRadius,
|
innerRadius,
|
||||||
innerRadius,
|
innerRadius,
|
||||||
);
|
);
|
||||||
|
|
||||||
final double gap = metrics.pixelSize * 2;
|
final gap = metrics.pixelSize * 2;
|
||||||
final double dotSize = radius - gap - (2 * strokeAdjust);
|
final dotSize = radius - gap - (2 * strokeAdjust);
|
||||||
final ui.Rect dotRect = Rect.fromLTWH(
|
final dotRect = Rect.fromLTWH(
|
||||||
offset.dx + metrics.pixelSize + strokeAdjust,
|
offset.dx + metrics.pixelSize + strokeAdjust,
|
||||||
offset.dy + metrics.pixelSize + strokeAdjust,
|
offset.dy + metrics.pixelSize + strokeAdjust,
|
||||||
dotSize,
|
dotSize,
|
||||||
@ -397,15 +397,15 @@ class QrPainter extends CustomPainter {
|
|||||||
canvas.drawRect(innerRect, innerPaint);
|
canvas.drawRect(innerRect, innerPaint);
|
||||||
canvas.drawRect(dotRect, dotPaint);
|
canvas.drawRect(dotRect, dotPaint);
|
||||||
} else {
|
} else {
|
||||||
final ui.RRect roundedOuterStrokeRect =
|
final roundedOuterStrokeRect =
|
||||||
RRect.fromRectAndRadius(outerRect, Radius.circular(radius));
|
RRect.fromRectAndRadius(outerRect, Radius.circular(radius));
|
||||||
canvas.drawRRect(roundedOuterStrokeRect, outerPaint);
|
canvas.drawRRect(roundedOuterStrokeRect, outerPaint);
|
||||||
|
|
||||||
final ui.RRect roundedInnerStrokeRect =
|
final roundedInnerStrokeRect =
|
||||||
RRect.fromRectAndRadius(outerRect, Radius.circular(innerRadius));
|
RRect.fromRectAndRadius(outerRect, Radius.circular(innerRadius));
|
||||||
canvas.drawRRect(roundedInnerStrokeRect, innerPaint);
|
canvas.drawRRect(roundedInnerStrokeRect, innerPaint);
|
||||||
|
|
||||||
final ui.RRect roundedDotStrokeRect =
|
final roundedDotStrokeRect =
|
||||||
RRect.fromRectAndRadius(dotRect, Radius.circular(dotSize));
|
RRect.fromRectAndRadius(dotRect, Radius.circular(dotSize));
|
||||||
canvas.drawRRect(roundedDotStrokeRect, dotPaint);
|
canvas.drawRRect(roundedDotStrokeRect, dotPaint);
|
||||||
}
|
}
|
||||||
@ -421,12 +421,12 @@ class QrPainter extends CustomPainter {
|
|||||||
if (requestedSize != null && !requestedSize.isEmpty) {
|
if (requestedSize != null && !requestedSize.isEmpty) {
|
||||||
return requestedSize;
|
return requestedSize;
|
||||||
} else if (requestedSize != null && _hasOneNonZeroSide(requestedSize)) {
|
} else if (requestedSize != null && _hasOneNonZeroSide(requestedSize)) {
|
||||||
final double maxSide = requestedSize.longestSide;
|
final maxSide = requestedSize.longestSide;
|
||||||
final double ratio = maxSide / originalSize.longestSide;
|
final ratio = maxSide / originalSize.longestSide;
|
||||||
return Size(ratio * originalSize.width, ratio * originalSize.height);
|
return Size(ratio * originalSize.width, ratio * originalSize.height);
|
||||||
} else {
|
} else {
|
||||||
final double maxSide = 0.25 * widgetSize.shortestSide;
|
final maxSide = 0.25 * widgetSize.shortestSide;
|
||||||
final double ratio = maxSide / originalSize.longestSide;
|
final ratio = maxSide / originalSize.longestSide;
|
||||||
return Size(ratio * originalSize.width, ratio * originalSize.height);
|
return Size(ratio * originalSize.width, ratio * originalSize.height);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -437,7 +437,7 @@ class QrPainter extends CustomPainter {
|
|||||||
Size size,
|
Size size,
|
||||||
QrEmbeddedImageStyle? style,
|
QrEmbeddedImageStyle? style,
|
||||||
) {
|
) {
|
||||||
final ui.Paint paint = Paint()
|
final paint = Paint()
|
||||||
..isAntiAlias = true
|
..isAntiAlias = true
|
||||||
..filterQuality = FilterQuality.high;
|
..filterQuality = FilterQuality.high;
|
||||||
if (style != null) {
|
if (style != null) {
|
||||||
@ -445,11 +445,11 @@ class QrPainter extends CustomPainter {
|
|||||||
paint.colorFilter = ColorFilter.mode(style.color!, BlendMode.srcATop);
|
paint.colorFilter = ColorFilter.mode(style.color!, BlendMode.srcATop);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
final ui.Size srcSize =
|
final srcSize =
|
||||||
Size(embeddedImage!.width.toDouble(), embeddedImage!.height.toDouble());
|
Size(embeddedImage!.width.toDouble(), embeddedImage!.height.toDouble());
|
||||||
final ui.Rect src =
|
final src =
|
||||||
Alignment.center.inscribe(srcSize, Offset.zero & srcSize);
|
Alignment.center.inscribe(srcSize, Offset.zero & srcSize);
|
||||||
final ui.Rect dst = Alignment.center.inscribe(size, position & size);
|
final dst = Alignment.center.inscribe(size, position & size);
|
||||||
canvas.drawImageRect(embeddedImage!, src, dst, paint);
|
canvas.drawImageRect(embeddedImage!, src, dst, paint);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -470,8 +470,8 @@ class QrPainter extends CustomPainter {
|
|||||||
|
|
||||||
/// Returns a [ui.Picture] object containing the QR code data.
|
/// Returns a [ui.Picture] object containing the QR code data.
|
||||||
ui.Picture toPicture(double size) {
|
ui.Picture toPicture(double size) {
|
||||||
final ui.PictureRecorder recorder = ui.PictureRecorder();
|
final recorder = ui.PictureRecorder();
|
||||||
final ui.Canvas canvas = Canvas(recorder);
|
final canvas = Canvas(recorder);
|
||||||
paint(canvas, Size(size, size));
|
paint(canvas, Size(size, size));
|
||||||
return recorder.endRecording();
|
return recorder.endRecording();
|
||||||
}
|
}
|
||||||
@ -486,7 +486,7 @@ class QrPainter extends CustomPainter {
|
|||||||
double size, {
|
double size, {
|
||||||
ui.ImageByteFormat format = ui.ImageByteFormat.png,
|
ui.ImageByteFormat format = ui.ImageByteFormat.png,
|
||||||
}) async {
|
}) async {
|
||||||
final ui.Image image = await toImage(size);
|
final image = await toImage(size);
|
||||||
return image.toByteData(format: format);
|
return image.toByteData(format: format);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -514,8 +514,8 @@ class _PaintMetrics {
|
|||||||
double get inset => _inset;
|
double get inset => _inset;
|
||||||
|
|
||||||
void _calculateMetrics() {
|
void _calculateMetrics() {
|
||||||
final double gapTotal = (moduleCount - 1) * gapSize;
|
final gapTotal = (moduleCount - 1) * gapSize;
|
||||||
final double pixelSize = (containerSize - gapTotal) / moduleCount;
|
final pixelSize = (containerSize - gapTotal) / moduleCount;
|
||||||
_pixelSize = (pixelSize * 2).roundToDouble() / 2;
|
_pixelSize = (pixelSize * 2).roundToDouble() / 2;
|
||||||
_innerContentSize = (_pixelSize * moduleCount) + gapTotal;
|
_innerContentSize = (_pixelSize * moduleCount) + gapTotal;
|
||||||
_inset = (containerSize - _innerContentSize) / 2;
|
_inset = (containerSize - _innerContentSize) / 2;
|
||||||
|
@ -12,9 +12,9 @@ import 'package:qr_flutter/qr_flutter.dart';
|
|||||||
|
|
||||||
void main() {
|
void main() {
|
||||||
testWidgets('QrImageView generates correct image', (
|
testWidgets('QrImageView generates correct image', (
|
||||||
WidgetTester tester,
|
tester,
|
||||||
) async {
|
) async {
|
||||||
final MaterialApp qrImage = MaterialApp(
|
final qrImage = MaterialApp(
|
||||||
home: Center(
|
home: Center(
|
||||||
child: RepaintBoundary(
|
child: RepaintBoundary(
|
||||||
child: QrImageView(
|
child: QrImageView(
|
||||||
@ -35,8 +35,8 @@ void main() {
|
|||||||
|
|
||||||
testWidgets(
|
testWidgets(
|
||||||
'QrImageView generates correct image with eye style',
|
'QrImageView generates correct image with eye style',
|
||||||
(WidgetTester tester) async {
|
(tester) async {
|
||||||
final MaterialApp qrImage = MaterialApp(
|
final qrImage = MaterialApp(
|
||||||
home: Center(
|
home: Center(
|
||||||
child: RepaintBoundary(
|
child: RepaintBoundary(
|
||||||
child: QrImageView(
|
child: QrImageView(
|
||||||
@ -62,8 +62,8 @@ void main() {
|
|||||||
|
|
||||||
testWidgets(
|
testWidgets(
|
||||||
'QrImageView generates correct image with data module style',
|
'QrImageView generates correct image with data module style',
|
||||||
(WidgetTester tester) async {
|
(tester) async {
|
||||||
final MaterialApp qrImage = MaterialApp(
|
final qrImage = MaterialApp(
|
||||||
home: Center(
|
home: Center(
|
||||||
child: RepaintBoundary(
|
child: RepaintBoundary(
|
||||||
child: QrImageView(
|
child: QrImageView(
|
||||||
@ -89,8 +89,8 @@ void main() {
|
|||||||
|
|
||||||
testWidgets(
|
testWidgets(
|
||||||
'QrImageView generates correct image with eye and data module sytle',
|
'QrImageView generates correct image with eye and data module sytle',
|
||||||
(WidgetTester tester) async {
|
(tester) async {
|
||||||
final MaterialApp qrImage = MaterialApp(
|
final qrImage = MaterialApp(
|
||||||
home: Center(
|
home: Center(
|
||||||
child: RepaintBoundary(
|
child: RepaintBoundary(
|
||||||
child: QrImageView(
|
child: QrImageView(
|
||||||
@ -123,8 +123,8 @@ void main() {
|
|||||||
testWidgets(
|
testWidgets(
|
||||||
'QrImageView does not apply eye and data module color when foreground '
|
'QrImageView does not apply eye and data module color when foreground '
|
||||||
'color is also specified',
|
'color is also specified',
|
||||||
(WidgetTester tester) async {
|
(tester) async {
|
||||||
final MaterialApp qrImage = MaterialApp(
|
final qrImage = MaterialApp(
|
||||||
home: Center(
|
home: Center(
|
||||||
child: RepaintBoundary(
|
child: RepaintBoundary(
|
||||||
child: QrImageView(
|
child: QrImageView(
|
||||||
@ -156,7 +156,7 @@ void main() {
|
|||||||
|
|
||||||
testWidgets(
|
testWidgets(
|
||||||
'QrImageView generates correct image with logo',
|
'QrImageView generates correct image with logo',
|
||||||
(WidgetTester tester) async {
|
(tester) async {
|
||||||
await pumpWidgetWithImages(
|
await pumpWidgetWithImages(
|
||||||
tester,
|
tester,
|
||||||
MaterialApp(
|
MaterialApp(
|
||||||
@ -196,7 +196,7 @@ Future<void> pumpWidgetWithImages(
|
|||||||
Future<void>? precacheFuture;
|
Future<void>? precacheFuture;
|
||||||
await tester.pumpWidget(
|
await tester.pumpWidget(
|
||||||
Builder(
|
Builder(
|
||||||
builder: (BuildContext buildContext) {
|
builder: (buildContext) {
|
||||||
precacheFuture = tester.runAsync(() async {
|
precacheFuture = tester.runAsync(() async {
|
||||||
await Future.wait(<Future<void>>[
|
await Future.wait(<Future<void>>[
|
||||||
for (final String assetName in assetNames)
|
for (final String assetName in assetNames)
|
||||||
|
@ -10,8 +10,8 @@ import 'package:flutter_test/flutter_test.dart';
|
|||||||
import 'package:qr_flutter/qr_flutter.dart';
|
import 'package:qr_flutter/qr_flutter.dart';
|
||||||
|
|
||||||
void main() {
|
void main() {
|
||||||
testWidgets('QrPainter generates correct image', (WidgetTester tester) async {
|
testWidgets('QrPainter generates correct image', (tester) async {
|
||||||
final QrPainter painter = QrPainter(
|
final painter = QrPainter(
|
||||||
data: 'The painter is this thing',
|
data: 'The painter is this thing',
|
||||||
version: QrVersions.auto,
|
version: QrVersions.auto,
|
||||||
gapless: true,
|
gapless: true,
|
||||||
@ -21,7 +21,7 @@ void main() {
|
|||||||
await tester.runAsync(() async {
|
await tester.runAsync(() async {
|
||||||
imageData = await painter.toImageData(600.0);
|
imageData = await painter.toImageData(600.0);
|
||||||
});
|
});
|
||||||
final Uint8List imageBytes = imageData!.buffer.asUint8List();
|
final imageBytes = imageData!.buffer.asUint8List();
|
||||||
final Widget widget = Center(
|
final Widget widget = Center(
|
||||||
child: RepaintBoundary(
|
child: RepaintBoundary(
|
||||||
child: SizedBox(
|
child: SizedBox(
|
||||||
|
Reference in New Issue
Block a user