feat(app): scan a printed seed label back into its record

Closes the physical↔digital loop the labels opened: the QR on a printed
envelope (tane://seed, already encoded by seed_label_codec) can now be
scanned from the inventory bar. A known label opens its variety; an
unknown one asks before adding anything, then creates the variety (species
linked by exact scientific name when bundled) with a lot carrying the
label's year and origin. Scanner is pure ZXing (zxing_barcode_scanner,
MIT) — no ML Kit, no Play Services, F-Droid-safe, the stack Ğ1nkgo ships.
Mobile-only; other platforms don't show the button (OCR precedent).
The post-scan flow is a plain function (handleScannedPayload) so it's
widget-tested without a camera.
This commit is contained in:
vjrj 2026-07-18 12:26:27 +02:00
parent bb5b3d4a43
commit f1aa8f8e66
18 changed files with 1130 additions and 42 deletions

View file

@ -201,6 +201,14 @@ packages:
url: "https://pub.dev"
source: hosted
version: "1.2.1"
code_builder:
dependency: transitive
description:
name: code_builder
sha256: "6a6cab2ba4680d6423f34a9b972a4c9a94ebe1b62ecec4e1a1f2cba91fd1319d"
url: "https://pub.dev"
source: hosted
version: "4.11.1"
collection:
dependency: transitive
description:
@ -996,6 +1004,14 @@ packages:
url: "https://pub.dev"
source: hosted
version: "7.0.2"
pigeon:
dependency: transitive
description:
name: pigeon
sha256: "04cfefc8add8b47ddf9ccac8b92bb4edeb67c87f185c623ba0db118ac99334ad"
url: "https://pub.dev"
source: hosted
version: "26.3.4"
platform:
dependency: transitive
description:
@ -1481,6 +1497,14 @@ packages:
url: "https://pub.dev"
source: hosted
version: "3.1.3"
zxing_barcode_scanner:
dependency: transitive
description:
name: zxing_barcode_scanner
sha256: "10f77da15624b1222d1e4b792991bf485b0b7c08d170b99e9a658c69a5fc0a3a"
url: "https://pub.dev"
source: hosted
version: "1.0.4"
sdks:
dart: ">=3.11.5 <4.0.0"
flutter: ">=3.38.4"