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:
1 parent
e42cae74f3
commit
7bee1c5644
3 files changed
+13
-14
No files matched your search
@@ -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';
|
||||
@@ -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
@@ -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:
|
||||
|
||||
Reference in new issue
Block a user