UScanner class

Live QR/barcode scanner widget with scan window, torch, zoom, gallery and hint; all 6 platforms. Needs dart run u:app permission add camera. UScanner(onScan: (text) => print(text))

Inheritance
Available extensions

Constructors

UScanner({ValueChanged<String>? onScan, ValueChanged<List<UCode>>? onCodes, void onScanError(Object error, StackTrace stackTrace)?, UCameraController? controller, bool autoStart = true, UCameraFacing facing = UCameraFacing.back, UCameraResolution resolution = UCameraResolution.high, UCameraLens? lensType, UScanSpeed speed = UScanSpeed.normal, Duration dedupeWindow = const Duration(milliseconds: 1500), List<UCodeFormat> formats = const <UCodeFormat>[], UScanEngine engine = UScanEngine.auto, bool torchEnabled = false, bool tryInvert = false, bool autoZoom = false, double? initialZoom, BoxFit fit = BoxFit.cover, Widget errorBuilder(BuildContext context, UCameraException error)?, WidgetBuilder? placeholderBuilder, LayoutWidgetBuilder? overlayBuilder, Rect? scanWindow, bool restrictToScanWindow = true, bool useAppLifecycleState = true, bool tapToFocus = true, bool pinchToZoom = true, bool singleScan = true, bool hapticOnScan = true, bool showOverlay = true, Color? overlayColor, Size scanWindowSize = const Size(280, 280), Color? borderColor, double borderWidth = 3, double borderRadius = 16, double cornerLength = 32, bool showCorners = true, bool showFullBorder = false, bool showScanLine = true, Color? scanLineColor, double scanLineThickness = 2, Duration scanLineDuration = const Duration(seconds: 2), bool showTrackingBoxes = false, String? hintText, bool showHint = true, TextStyle? hintTextStyle, UScannerHintPosition hintPosition = UScannerHintPosition.bottom, double hintGap = 20, EdgeInsets hintPadding = const EdgeInsets.symmetric(horizontal: 14, vertical: 10), Color? hintBackgroundColor, double hintBorderRadius = 12, bool showControls = true, bool showTorchButton = true, bool showSwitchCameraButton = true, bool showGalleryButton = false, bool showZoomSlider = false, Alignment controlsAlignment = Alignment.bottomCenter, double controlsSpacing = 24, EdgeInsets controlsPadding = const EdgeInsets.only(bottom: 40), Color? controlIconColor, Color? controlActiveIconColor, Color? controlBackgroundColor, double controlButtonSize = 52, double controlIconSize = 26, IconData torchOnIcon = Icons.flash_on_rounded, IconData torchOffIcon = Icons.flash_off_rounded, IconData switchCameraIcon = Icons.cameraswitch_rounded, IconData galleryIcon = Icons.photo_library_rounded, Key? key})
const

Properties

autoStart → bool
Starts the camera as soon as it is shown.
final
autoZoom → bool
Zooms in automatically on small/far codes.
final
borderColor → Color?
Border color.
final
borderRadius → double
Corner radius.
final
borderWidth → double
Border thickness.
final
controlActiveIconColor → Color?
Control icon color when on (torch).
final
controlBackgroundColor → Color?
Control button background.
final
controlButtonSize → double
Control button size.
final
controlIconColor → Color?
Control icon color.
final
controlIconSize → double
Control icon size.
final
controller → UCameraController?
External controller. When given, the session options below are ignored.
final
controlsAlignment → Alignment
Where the controls sit.
final
controlsPadding → EdgeInsets
Padding around the controls.
final
controlsSpacing → double
Gap between control buttons.
final
cornerLength → double
Length of the corner marks.
final
dedupeWindow → Duration
Ignores the same code again within this time.
final
engine → UScanEngine
Decoder: native (fast, uses the OS) or pure Dart (works everywhere).
final
errorBuilder → Widget Function(BuildContext context, UCameraException error)?
Shown when loading fails.
final
facing → UCameraFacing
Which camera to start with: back or front.
final
fit → BoxFit
How the content fits its box (BoxFit).
final
formats → List<UCodeFormat>
Empty means every supported symbology. Restricting this is the single biggest speed win available.
final
galleryIcon → IconData
Gallery icon.
final
hapticOnScan → bool
Vibrates when a code is read (mobile).
final
hashCode → int
The hash code for this object.
no setterinherited
hintBackgroundColor → Color?
Hint bubble color.
final
hintBorderRadius → double
Hint bubble corner radius.
final
hintGap → double
Gap between the scan window and the hint.
final
hintPadding → EdgeInsets
Padding inside the hint bubble.
final
hintPosition → UScannerHintPosition
Hint above or below the scan window.
final
hintText → String?
Grey hint shown while empty.
final
hintTextStyle → TextStyle?
Hint text style.
final
initialZoom → double?
Starting zoom level.
final
key → Key?
Controls how one widget replaces another widget in the tree.
finalinherited
lensType → UCameraLens?
Preferred lens (wide, ultra-wide, telephoto) when the device has several.
final
onCodes → ValueChanged<List<UCode>>?
Called with every symbol in each detection, with geometry and metadata.
final
onScan → ValueChanged<String>?
Called with the raw value of the first symbol in each detection.
final
onScanError → void Function(Object error, StackTrace stackTrace)?
Called when scanning fails (camera or decoder error).
final
overlayBuilder → LayoutWidgetBuilder?
Draws your own overlay over the preview.
final
overlayColor → Color?
Color of the dimmed area.
final
pinchToZoom → bool
Pinch to zoom.
final
placeholderBuilder → WidgetBuilder?
Shown while the camera starts or when it is unavailable.
final
resolution → UCameraResolution
Resolution.
final
restrictToScanWindow → bool
Only reads codes inside the scan window.
final
runtimeType → Type
A representation of the runtime type of the object.
no setterinherited
scanLineColor → Color?
Scan line color.
final
scanLineDuration → Duration
Time for one pass of the scan line.
final
scanLineThickness → double
Scan line thickness.
final
scanWindow → Rect?
Explicit detection window in widget coordinates. Overrides restrictToScanWindow plus scanWindowSize.
final
scanWindowSize → Size
Size of the scan window.
final
showControls → bool
Shows the torch/switch/gallery/zoom controls.
final
showCorners → bool
Shows corner marks on the scan window.
final
showFullBorder → bool
Draws the whole scan window border.
final
showGalleryButton → bool
Shows a button to scan a picked image.
final
showHint → bool
Shows the hint text.
final
showOverlay → bool
Dims everything outside the scan window.
final
showScanLine → bool
Shows the moving scan line.
final
showSwitchCameraButton → bool
Shows the front/back camera button.
final
showTorchButton → bool
Shows the flashlight button.
final
showTrackingBoxes → bool
Draws a live box around each detected symbol.
final
showZoomSlider → bool
Shows a zoom slider.
final
singleScan → bool
Stop reporting after the first successful scan.
final
speed → UScanSpeed
Speed.
final
switchCameraIcon → IconData
Switch camera icon.
final
tapToFocus → bool
Tap on the preview to focus there.
final
torchEnabled → bool
Starts with the flashlight on.
final
torchOffIcon → IconData
Icon when the torch is off.
final
torchOnIcon → IconData
Icon when the torch is on.
final
tryInvert → bool
Also try the inverted image, for light-on-dark symbols.
final
useAppLifecycleState → bool
Pauses the camera when the app goes to the background.
final

Methods

alignAtBottomCenter({Key? key, double? heightFactor, double? widthFactor}) → Align

Available on Widget, provided by the WidgetsExtension extension

Aligned to the bottom center.
alignAtBottomLeft({Key? key, double? heightFactor, double? widthFactor}) → Align

Available on Widget, provided by the WidgetsExtension extension

Aligned to the bottom left.
alignAtBottomRight({Key? key, double? heightFactor, double? widthFactor}) → Align

Available on Widget, provided by the WidgetsExtension extension

Aligned to the bottom right.
alignAtCenter({Key? key, double? heightFactor, double? widthFactor}) → Align

Available on Widget, provided by the WidgetsExtension extension

Centered.
alignAtCenterLeft({Key? key, double? heightFactor, double? widthFactor}) → Align

Available on Widget, provided by the WidgetsExtension extension

Aligned to the center left.
alignAtCenterRight({Key? key, double? heightFactor, double? widthFactor}) → Align

Available on Widget, provided by the WidgetsExtension extension

Aligned to the center right.
alignAtLERP(Alignment a, Alignment b, double t, {Key? key, double? heightFactor, double? widthFactor}) → Align

Available on Widget, provided by the WidgetsExtension extension

Aligned between a and b at t (0 = a, 1 = b).
alignAtTopCenter({Key? key, double? heightFactor, double? widthFactor}) → Align

Available on Widget, provided by the WidgetsExtension extension

Aligned to the top center.
alignAtTopLeft({Key? key, double? heightFactor, double? widthFactor}) → Align

Available on Widget, provided by the WidgetsExtension extension

Aligned to the top left.
alignAtTopRight({Key? key, double? heightFactor, double? widthFactor}) → Align

Available on Widget, provided by the WidgetsExtension extension

Aligned to the top right.
alignXY(double x, double y, {Key? key, double? heightFactor, double? widthFactor}) → Align

Available on Widget, provided by the WidgetsExtension extension

Aligned at x, y from -1 to 1. child.alignXY(0, -0.5)
card({Color? backgroundColor, double? elevation, EdgeInsetsGeometry? margin}) → Widget

Available on Widget, provided by the WidgetsExtension extension

Material Card around it. child.card(elevation: 2)
center() → Widget

Available on Widget, provided by the WidgetsExtension extension

Centered in the available space. child.center()
chip({required Color backgroundColor, double? width, double? height, Alignment? alignment, double borderWidth = 1, double radius = 12, Color borderColor = Colors.transparent, EdgeInsets padding = const EdgeInsets.symmetric(horizontal: 8, vertical: 6), EdgeInsetsGeometry? margin, BoxConstraints? constraints}) → Widget

Available on Widget, provided by the WidgetsExtension extension

Pill-shaped colored box, e.g. for tags. Text("New").chip(backgroundColor: Colors.green.shade100)
clipCircle() → Widget

Available on Widget, provided by the WidgetsExtension extension

Clips to a circle. avatar.clipCircle()
clipRadius(double radius) → Widget

Available on Widget, provided by the WidgetsExtension extension

Rounds the corners by clipping. image.clipRadius(12)
container({double? width, double? height, Alignment? alignment, Color? backgroundColor, double borderWidth = 1, double radius = 1, Color borderColor = Colors.transparent, EdgeInsetsGeometry? padding, EdgeInsetsGeometry? margin, BoxConstraints? constraints}) → Widget

Available on Widget, provided by the WidgetsExtension extension

Box with background, border and rounded corners. child.container(backgroundColor: Colors.white, radius: 12)
createElement() → StatefulElement
Creates a StatefulElement to manage this widget's location in the tree.
inherited
createState() → State<UScanner>
Creates the mutable state for this widget at a given location in the tree.
override
debugDescribeChildren() → List<DiagnosticsNode>
Returns a list of DiagnosticsNode objects describing this node's children.
inherited
debugFillProperties(DiagnosticPropertiesBuilder properties) → void
Add additional properties associated with the node.
inherited
disabled(bool disabled, {double opacity = 0.5}) → Widget

Available on Widget, provided by the WidgetsExtension extension

Greys out and blocks taps when disabled. form.disabled(isSaving)
expanded({int flex = 1}) → Widget

Available on Widget, provided by the WidgetsExtension extension

Takes the remaining space in a Row/Column. child.expanded()
fadeSlideIn({int milliseconds = 1000, double offset = 24}) → Widget

Available on Widget, provided by the WidgetsExtension extension

Fades and slides up once when first shown. card.fadeSlideIn()
fit({Alignment alignment = Alignment.center}) → Widget

Available on Widget, provided by the WidgetsExtension extension

Shrinks to fit the space (never grows). Text(long).fit()
flexible({int flex = 1}) → Widget

Available on Widget, provided by the WidgetsExtension extension

Can shrink in a Row/Column but does not have to fill. child.flexible()
form(GlobalKey<FormState> key) → Widget

Available on Widget, provided by the WidgetsExtension extension

Wraps in a Form with key. column.form(formKey)
hero(Object tag) → Widget

Available on Widget, provided by the WidgetsExtension extension

Hero animation between pages with the same tag. image.hero("product-$id")
ltr() → Widget

Available on Widget, provided by the WidgetsExtension extension

Forces left-to-right (numbers, phone numbers, code). Text(phone).ltr()
noSuchMethod(Invocation invocation) → dynamic
Invoked when a nonexistent method or property is accessed.
inherited
onDoubleTap(GestureTapCallback? onPressed) → Widget

Available on Widget, provided by the WidgetsExtension extension

Double tap. image.onDoubleTap(like)
onLongPress(GestureTapCallback? onPressed) → Widget

Available on Widget, provided by the WidgetsExtension extension

Long press. child.onLongPress(showOptions)
onPress(VoidCallback onTap, {double pressedScale = 0.9, Duration duration = const Duration(milliseconds: 120)}) → Widget

Available on Widget, provided by the WidgetsExtension extension

Tap with a press-down shrink animation. card.onPress(open)
onTap(GestureTapCallback? onPressed) → Widget

Available on Widget, provided by the WidgetsExtension extension

Tap without ripple. child.onTap(open)
onTapInk(GestureTapCallback? onPressed) → Widget

Available on Widget, provided by the WidgetsExtension extension

Tap with a Material ripple (needs a Material ancestor). tile.onTapInk(open)
opacity(double opacity) → Widget

Available on Widget, provided by the WidgetsExtension extension

Makes it see-through (0 = invisible, 1 = solid). child.opacity(0.5)
pAll(double padding) → Widget

Available on Widget, provided by the WidgetsExtension extension

Same padding on every side. child.pAll(16)
pLTRB(double left, double top, double right, double bottom) → Widget

Available on Widget, provided by the WidgetsExtension extension

Padding left, top, right, bottom. child.pLTRB(8, 4, 8, 4)
pOnly({double left = 0.0, double top = 0.0, double right = 0.0, double bottom = 0.0}) → Widget

Available on Widget, provided by the WidgetsExtension extension

Padding on chosen sides. child.pOnly(top: 8)
position({double? left, double? top, double? right, double? bottom, double? width, double? height}) → Widget

Available on Widget, provided by the WidgetsExtension extension

Positioned inside a Stack. badge.position(top: 0, right: 0)
pSymmetric({double horizontal = 0.0, double vertical = 0.0}) → Widget

Available on Widget, provided by the WidgetsExtension extension

Horizontal and/or vertical padding. child.pSymmetric(horizontal: 16)
rotate(double scale) → Widget

Available on Widget, provided by the WidgetsExtension extension

Rotates by scale radians. arrow.rotate(pi / 2)
rtl() → Widget

Available on Widget, provided by the WidgetsExtension extension

Forces right-to-left. child.rtl()
safeArea() → Widget

Available on Widget, provided by the WidgetsExtension extension

Keeps it out of the notch and system bars. body.safeArea()
scale(double scale) → Widget

Available on Widget, provided by the WidgetsExtension extension

Scales the paint (layout size unchanged). icon.scale(1.5)
scrollable({Axis scrollDirection = Axis.vertical}) → Widget

Available on Widget, provided by the WidgetsExtension extension

Makes it scroll when it does not fit. column.scrollable()
showMenus(List<PopupMenuEntry<int>> items) → Widget

Available on Widget, provided by the WidgetsExtension extension

Shows a popup menu where the user taps; items return their int value. child.showMenus([PopupMenuItem(value: 1, child: Text("Edit"))])
sized({double? width, double? height}) → Widget

Available on Widget, provided by the WidgetsExtension extension

Fixed width and/or height. logo.sized(width: 48, height: 48)
skeleton(bool loading) → Widget

Available on Widget, provided by the WidgetsExtension extension

Draws a shimmering loading placeholder in its shape while loading. Text("Name").skeleton(isLoading)
sliver() → Widget

Available on Widget, provided by the WidgetsExtension extension

Lets a normal widget sit inside a CustomScrollView. header.sliver()
toDiagnosticsNode({String? name, DiagnosticsTreeStyle? style}) → DiagnosticsNode
Returns a debug representation of the object that is used by debugging tools and by DiagnosticsNode.toStringDeep.
inherited
tooltip(String message) → Widget

Available on Widget, provided by the WidgetsExtension extension

Shows message on long press / mouse hover. icon.tooltip("Delete")
toString({DiagnosticLevel minLevel = DiagnosticLevel.info}) → String
A string representation of this object.
inherited
toStringDeep({String prefixLineOne = '', String? prefixOtherLines, DiagnosticLevel minLevel = DiagnosticLevel.debug, int wrapWidth = 65}) → String
Returns a string representation of this node and its descendants.
inherited
toStringShallow({String joiner = ', ', DiagnosticLevel minLevel = DiagnosticLevel.debug}) → String
Returns a one-line detailed description of the object.
inherited
toStringShort() → String
A short, textual description of this widget.
inherited
translate(Offset offset) → Widget

Available on Widget, provided by the WidgetsExtension extension

Moves the paint by offset (layout unchanged). child.translate(const Offset(0, -4))
visible(bool visible, {bool maintainSize = false}) → Widget

Available on Widget, provided by the WidgetsExtension extension

Shows it only when visible; with maintainSize it keeps its space. saveButton.visible(isDirty)

Operators

operator ==(Object other) → bool
The equality operator.
inherited