fix: Build-Fehler beheben (compileSdk, nfc_manager 3.x→4.x API)

nfc_manager 3.5.1 verlangte compileSdk 31 in seinem eigenen Android-Modul,
kollidierte mit AndroidX-Transitivdeps die 33+ brauchen → Upgrade auf
nfc_manager 4.2.1 (compileSdk 36 im App-build.gradle.kts explizit gesetzt).
API hat sich geändert: isAvailable()→checkAvailability(), startSession
braucht jetzt pollingOptions, UID-Auslesen über NfcTagAndroid.from(tag).id
statt tag.data-Map. v0.1.1+2, erfolgreich auf 236 gebaut, deployed auf 137.

Nebenbefund: Gradle/Kotlin-Daemons mit -Xmx8G stapelten sich auf 236 (nur
10GB RAM) und blockierten sogar SSH – gradle.properties auf -Xmx2G gesenkt.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Dzdm3EWeNdYFUuXFRJryA1
This commit is contained in:
patrickandClaude Sonnet 5 committed 2026-09-10 02:43:10 +02:00
1 parent e42cae74f3
commit 7bee1c5644
3 files changed
+13 -14

No files matched your search

+1 -1
View File
@@ -1,3 +1,3 @@
/// Manuell mit pubspec.yaml synchron halten (siehe timemaster-mobile,
/// gleiche Konvention – kein package_info_plus während aktiver Feldtests).
const String kAppVersion = '0.1.0+1';
const String kAppVersion = '0.1.1+2';
+10 -11
View File
@@ -2,6 +2,7 @@ import 'dart:async';
import 'package:dio/dio.dart';
import 'package:flutter/material.dart';
import 'package:nfc_manager/nfc_manager.dart';
import 'package:nfc_manager/nfc_manager_android.dart';
import '../app_version.dart';
import '../models/kiosk_session.dart';
import '../services/api_client.dart';
@@ -66,9 +67,9 @@ class _LoginScreenState extends State<LoginScreen> {
}
Future<void> _startNfcScan() async {
final available = await NfcManager.instance.isAvailable();
if (!available) {
setState(() => _error = 'NFC ist auf diesem Gerät nicht verfügbar.');
final availability = await NfcManager.instance.checkAvailability();
if (availability != NfcAvailability.enabled) {
setState(() => _error = 'NFC ist nicht verfügbar oder deaktiviert (Status: ${availability.name}).');
return;
}
setState(() {
@@ -78,6 +79,7 @@ class _LoginScreenState extends State<LoginScreen> {
});
try {
await NfcManager.instance.startSession(
pollingOptions: {NfcPollingOption.iso14443, NfcPollingOption.iso15693, NfcPollingOption.iso18092},
onDiscovered: (NfcTag tag) async {
final uid = _extractUid(tag);
await NfcManager.instance.stopSession();
@@ -99,15 +101,12 @@ class _LoginScreenState extends State<LoginScreen> {
}
}
/// Android-spezifisch (siehe nfc_manager 4.x: NfcTagAndroid.from(tag).id).
/// Nur Android relevant – Kiosk-Tablets, kein iOS-Support geplant.
String? _extractUid(NfcTag tag) {
for (final key in ['nfca', 'nfcb', 'nfcf', 'nfcv', 'mifareclassic', 'mifareultralight', 'isodep']) {
final techData = tag.data[key];
if (techData is Map && techData['identifier'] != null) {
final bytes = (techData['identifier'] as List<dynamic>).cast<int>();
return bytes.map((b) => b.toRadixString(16).padLeft(2, '0')).join().toUpperCase();
}
}
return null;
final androidTag = NfcTagAndroid.from(tag);
if (androidTag == null) return null;
return androidTag.id.map((b) => b.toRadixString(16).padLeft(2, '0')).join().toUpperCase();
}
Future<void> _submitNfc() async {
+2 -2
View File
@@ -1,7 +1,7 @@
name: timemaster_kiosk
description: TimeMaster Kiosk – Stempeluhr für Android-Tablets hinter VPN
publish_to: 'none'
version: 0.1.0+1
version: 0.1.1+2
environment:
sdk: '>=3.3.0 <4.0.0'
@@ -12,7 +12,7 @@ dependencies:
cupertino_icons: ^1.0.8
dio: ^5.7.0
flutter_secure_storage: ^9.2.2
nfc_manager: ^3.5.0
nfc_manager: ^4.2.1
dev_dependencies:
flutter_test: