outsourced add cam main widgets and cleaned karte widget up

time
This commit is contained in:
Nico
2025-05-10 18:04:32 +02:00
parent 9879809857
commit 2a43ed5514
11 changed files with 635 additions and 641 deletions

View File

@@ -1,5 +1,4 @@
import 'package:fforte/enums/databases.dart';
import 'package:fforte/screens/addCam/cam_widgets.dart';
import 'package:fforte/screens/helper/dialog_helper.dart';
import 'package:fforte/screens/helper/snack_bar_helper.dart';
import 'package:fforte/screens/addCam/exceptions/location_disabled_exception.dart';
@@ -15,6 +14,13 @@ import 'package:geolocator/geolocator.dart';
import 'package:latlong2/latlong.dart';
import 'package:animations/animations.dart';
import 'widgets/abbau_dat.dart';
import 'widgets/karte.dart';
import 'widgets/kont_dat.dart';
import 'widgets/mez.dart';
import 'widgets/platzung.dart';
import 'widgets/status.dart';
class AddCamMain extends StatefulWidget {
final bool isTemplate;
final bool isFinished;
@@ -388,7 +394,6 @@ class _AddCamMainState extends State<AddCamMain> {
content: Column(
children: [
Row(
// TODO MAYBE FIX
children: [
Column(
children: [
@@ -408,15 +413,8 @@ class _AddCamMainState extends State<AddCamMain> {
ortInfoC: rmap["OrtInfo"]!["controller"],
beiOrtC: rmap["BeiOrt"]!["controller"],
currentPosition: currentPosition,
onPositionChange: (updatedPosition) {
setState(() {
currentPosition = updatedPosition;
rmap["DECLNG"]!["controller"]!.text =
updatedPosition.longitude.toString();
rmap["DECLAT"]!["controller"]!.text =
updatedPosition.latitude.toString();
});
},
decLatC: rmap["DECLAT"]!["controller"],
decLngC: rmap["DECLNG"]!["controller"],
);
}));
if (result != null) {

View File

@@ -1,655 +1,25 @@
import 'package:flutter/material.dart';
import 'package:flutter_gen/gen_l10n/app_localizations.dart';
import 'package:flutter_map/flutter_map.dart';
import 'package:geolocator/geolocator.dart';
import 'package:latlong2/latlong.dart';
import 'package:geocoding/geocoding.dart';
// Karte
// ! completely new page
class Karte extends StatefulWidget {
final TextEditingController beiOrtC;
final TextEditingController ortInfoC;
final Position currentPosition;
final Function(Position) onPositionChange;
const Karte(
{super.key,
required this.currentPosition,
required this.onPositionChange,
required this.beiOrtC,
required this.ortInfoC});
@override
KarteState createState() => KarteState();
}
class KarteState extends State<Karte> {
List<Marker> markers = [];
LatLng? selectedPosition;
Position? updatedPosition;
bool saveVisible = false;
@override
void initState() {
super.initState();
markers = [
Marker(
point: LatLng(widget.currentPosition.latitude,
widget.currentPosition.longitude),
child: const Icon(
Icons.location_on,
color: Colors.red,
))
];
}
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text(AppLocalizations.of(context)!.map),
actions: [
Visibility(
visible: saveVisible,
child: Row(
children: [
Text(AppLocalizations.of(context)!.saveMap),
TextButton(
onPressed: () async {
List<Placemark> placemarks = await placemarkFromCoordinates(
selectedPosition!.latitude,
selectedPosition!.longitude);
// print(placemarks);
if (selectedPosition != null) {
setState(() {
widget.beiOrtC.text = placemarks.first.locality!;
widget.ortInfoC.text = placemarks.first.street!;
updatedPosition = Position(
longitude: selectedPosition!.longitude,
latitude: selectedPosition!.latitude,
timestamp: DateTime.now(),
accuracy: 0.0,
altitude: 0.0,
altitudeAccuracy: 0.0,
heading: 0.0,
headingAccuracy: 0.0,
speed: 0.0,
speedAccuracy: 0.0);
widget.onPositionChange(updatedPosition!);
});
}
if (context.mounted) Navigator.pop(context);
},
child: const Icon(Icons.save),
),
],
),
),
],
),
body: FlutterMap(
mapController: MapController(),
options: MapOptions(
interactionOptions: const InteractionOptions(
flags: InteractiveFlag.pinchZoom |
InteractiveFlag.drag |
InteractiveFlag.pinchMove),
initialCenter: LatLng(widget.currentPosition.latitude,
widget.currentPosition.longitude),
initialZoom: 16.0,
onTap: _handleTap,
),
children: [
TileLayer(
urlTemplate: 'https://tile.openstreetmap.org/{z}/{x}/{y}.png',
userAgentPackageName: 'com.example.app',
),
MarkerLayer(markers: markers),
]),
);
}
_handleTap(TapPosition position, LatLng latlng) {
setState(() {
markers.clear();
markers.add(
Marker(
width: 80.0,
height: 80.0,
point: latlng,
child: const Icon(
Icons.location_on,
color: Colors.red,
),
),
);
selectedPosition = latlng;
saveVisible = true;
});
ScaffoldMessenger.of(context).showSnackBar(SnackBar(
content: Text(
"${AppLocalizations.of(context)!.markerSet}\n${selectedPosition!.latitude}\n${selectedPosition!.longitude}")));
}
}
// Status
class Status extends StatefulWidget {
final Function(String) onStatusChanged;
final String initialStatus;
const Status(
{super.key, required this.onStatusChanged, this.initialStatus = 'Aktiv'});
@override
State<Status> createState() => _StatusState();
}
class _StatusState extends State<Status> {
String? _selectedStatus;
@override
void initState() {
super.initState();
_selectedStatus = widget.initialStatus;
}
@override
Widget build(BuildContext context) {
return Column(
children: [
ListTile(
visualDensity: const VisualDensity(vertical: -4),
title: Text(AppLocalizations.of(context)!.aktiv),
leading: Radio<String>(
value: 'aktiv',
groupValue: _selectedStatus,
onChanged: (value) {
setState(() {
_selectedStatus = value;
widget.onStatusChanged(value!);
});
},
),
),
ListTile(
visualDensity: const VisualDensity(vertical: -4),
title: Text(AppLocalizations.of(context)!.inaktiv),
leading: Radio<String>(
value: 'inaktiv',
groupValue: _selectedStatus,
onChanged: (value) {
setState(() {
_selectedStatus = value;
widget.onStatusChanged(value!);
});
},
),
),
],
);
}
}
// STTyp
class STTyp extends StatefulWidget {
final Function(String) onSTTypChanged;
final String initialSTTyp;
const STTyp(
{super.key,
required this.onSTTypChanged,
this.initialSTTyp = 'opportunistisch'});
@override
State<STTyp> createState() => _STTypState();
}
class _STTypState extends State<STTyp> {
String? _selectedSTTyp;
@override
void initState() {
super.initState();
_selectedSTTyp = widget.initialSTTyp;
}
@override
Widget build(BuildContext context) {
return Column(
children: [
ListTile(
visualDensity: const VisualDensity(vertical: -4),
title: Text(AppLocalizations.of(context)!.opportunistisch),
leading: Radio<String>(
value: 'opportunistisch',
groupValue: _selectedSTTyp,
onChanged: (value) {
setState(() {
_selectedSTTyp = value;
widget.onSTTypChanged(value!);
});
},
),
),
ListTile(
visualDensity: const VisualDensity(vertical: -4),
title: Text(AppLocalizations.of(context)!.systematisch),
leading: Radio<String>(
value: 'systematisch',
groupValue: _selectedSTTyp,
onChanged: (value) {
setState(() {
_selectedSTTyp = value;
widget.onSTTypChanged(value!);
});
},
),
),
],
);
}
}
// platzung
class Platzung extends StatefulWidget {
final Function(String) onPlatzungChanged;
final String? initialPlatzung;
const Platzung({
super.key,
required this.onPlatzungChanged,
this.initialPlatzung,
});
@override
State<Platzung> createState() => _PlatzungState();
}
class _PlatzungState extends State<Platzung> {
String? _selectedPlatzung;
@override
void initState() {
super.initState();
if (widget.initialPlatzung != "") {
_selectedPlatzung = widget.initialPlatzung;
}
}
@override
Widget build(BuildContext context) {
return Column(
children: [
ListTile(
visualDensity: const VisualDensity(vertical: -4),
title: Text(AppLocalizations.of(context)!.kirrung),
leading: Radio<String>(
value: 'Kirrung',
groupValue: _selectedPlatzung,
onChanged: (value) {
setState(() {
_selectedPlatzung = value;
widget.onPlatzungChanged(value!);
});
},
),
),
ListTile(
visualDensity: const VisualDensity(vertical: -4),
title: Text(AppLocalizations.of(context)!.wasserstelle),
leading: Radio<String>(
value: 'Wasserstelle',
groupValue: _selectedPlatzung,
onChanged: (value) {
setState(() {
_selectedPlatzung = value;
widget.onPlatzungChanged(value!);
});
},
),
),
ListTile(
visualDensity: const VisualDensity(vertical: -4),
title: Text(AppLocalizations.of(context)!.wald),
leading: Radio<String>(
value: 'Wald',
groupValue: _selectedPlatzung,
onChanged: (value) {
setState(() {
_selectedPlatzung = value;
widget.onPlatzungChanged(value!);
});
},
),
),
ListTile(
visualDensity: const VisualDensity(vertical: -4),
title: Text(AppLocalizations.of(context)!.wildwechsel),
leading: Radio<String>(
value: 'Wildwechsel',
groupValue: _selectedPlatzung,
onChanged: (value) {
setState(() {
_selectedPlatzung = value;
widget.onPlatzungChanged(value!);
});
},
),
),
ListTile(
visualDensity: const VisualDensity(vertical: -4),
title: Text(AppLocalizations.of(context)!.wegstrasse),
leading: Radio<String>(
value: 'Weg/Straße',
groupValue: _selectedPlatzung,
onChanged: (value) {
setState(() {
_selectedPlatzung = value;
widget.onPlatzungChanged(value!);
});
},
),
),
ListTile(
visualDensity: const VisualDensity(vertical: -4),
title: Text(AppLocalizations.of(context)!.hofgarten),
leading: Radio<String>(
value: 'Hof/Garten',
groupValue: _selectedPlatzung,
onChanged: (value) {
setState(() {
_selectedPlatzung = value;
widget.onPlatzungChanged(value!);
});
},
),
),
ListTile(
visualDensity: const VisualDensity(vertical: -4),
title: Text(AppLocalizations.of(context)!.wiesefeld),
leading: Radio<String>(
value: 'Wiese/Feld/Offenfläche',
groupValue: _selectedPlatzung,
onChanged: (value) {
setState(() {
_selectedPlatzung = value;
widget.onPlatzungChanged(value!);
});
},
),
),
],
);
}
}
// FotoFilm
class FotoFilm extends StatefulWidget {
final Function(String) onFotoFilmChanged;
final String initialFotoFilm;
const FotoFilm(
{super.key,
required this.onFotoFilmChanged,
this.initialFotoFilm = 'foto'});
@override
State<FotoFilm> createState() => _FotoFilmState();
}
class _FotoFilmState extends State<FotoFilm> {
String? _selectedFotoFilm;
@override
void initState() {
super.initState();
_selectedFotoFilm = widget.initialFotoFilm;
}
@override
Widget build(BuildContext context) {
return Column(
children: [
ListTile(
visualDensity: const VisualDensity(vertical: -4),
title: Text(AppLocalizations.of(context)!.foto),
leading: Radio<String>(
value: 'Foto',
groupValue: _selectedFotoFilm,
onChanged: (value) {
setState(() {
_selectedFotoFilm = value;
widget.onFotoFilmChanged(value!);
});
},
),
),
ListTile(
visualDensity: const VisualDensity(vertical: -4),
title: Text(AppLocalizations.of(context)!.film),
leading: Radio<String>(
value: 'Film',
groupValue: _selectedFotoFilm,
onChanged: (value) {
setState(() {
_selectedFotoFilm = value;
widget.onFotoFilmChanged(value!);
});
},
),
),
],
);
}
}
// MEZ
class MEZ extends StatefulWidget {
final Function(String) onMEZChanged;
final String initialMEZ;
const MEZ(
{super.key, required this.onMEZChanged, this.initialMEZ = 'sommerzeit'});
@override
State<MEZ> createState() => _MEZState();
}
class _MEZState extends State<MEZ> {
String? _selectedMEZ;
@override
void initState() {
super.initState();
_selectedMEZ = widget.initialMEZ;
}
@override
Widget build(BuildContext context) {
return Column(
children: [
ListTile(
visualDensity: const VisualDensity(vertical: -4),
title: Text(AppLocalizations.of(context)!.sommerzeit),
leading: Radio<String>(
value: 'Sommerzeit',
groupValue: _selectedMEZ,
onChanged: (value) {
setState(() {
_selectedMEZ = value;
widget.onMEZChanged(value!);
});
},
),
),
ListTile(
visualDensity: const VisualDensity(vertical: -4),
title: Text(AppLocalizations.of(context)!.winterzeit),
leading: Radio<String>(
value: 'Winterzeit',
groupValue: _selectedMEZ,
onChanged: (value) {
setState(() {
_selectedMEZ = value;
widget.onMEZChanged(value!);
});
},
),
),
],
);
}
}
// KontDat
class KontDat extends StatefulWidget {
final DateTime? initKontDat;
final Function(DateTime) onDateChanged;
const KontDat(
{super.key, required this.initKontDat, required this.onDateChanged});
@override
State<KontDat> createState() => _KontDatState();
}
class _KontDatState extends State<KontDat> {
DateTime? kontDat;
@override
void initState() {
super.initState();
kontDat = widget.initKontDat;
}
@override
Widget build(BuildContext context) {
return Row(
children: [
Row(children: [
SizedBox(
width: 140,
child: ElevatedButton(
onPressed: () async {
final date = await pickDate();
if (date == null) return;
setState(() {
kontDat = date;
});
widget.onDateChanged(date);
},
child: Text(AppLocalizations.of(context)!.pickkontdat)),
),
const SizedBox(
width: 10,
),
Text(
'${kontDat?.day}. ${kontDat?.month}. ${kontDat?.year}',
),
]),
],
);
}
Future<DateTime?> pickDate() async {
final date = await showDatePicker(
context: context,
initialDate: kontDat ?? DateTime.now(),
firstDate: DateTime(2000),
lastDate: DateTime(5000));
return date;
}
}
// AbbauDat
class AbbauDat extends StatefulWidget {
final DateTime? initAbbauDat;
final Function(DateTime) onDateChanged;
const AbbauDat({super.key, required this.initAbbauDat, required this.onDateChanged});
@override
State<AbbauDat> createState() => _AbbauDatState();
}
class _AbbauDatState extends State<AbbauDat> {
DateTime? abbauDat;
@override
void initState() {
super.initState();
abbauDat = widget.initAbbauDat;
}
@override
Widget build(BuildContext context) {
return Row(
children: [
Column(children: [
SizedBox(
width: 140,
child: ElevatedButton(
onPressed: () async {
final date = await pickDate();
if (date == null) return;
setState(() => abbauDat = date);
widget.onDateChanged(date);
},
child: Text(AppLocalizations.of(context)!.pickabbaudat)),
),
Row(
children: [
const SizedBox(
width: 10,
),
Builder(builder: (context) {
if (abbauDat != null) {
return Text(
'${abbauDat?.day}. ${abbauDat?.month}. ${abbauDat?.year}');
} else {
return Text(AppLocalizations.of(context)!.nichts);
}
}),
const SizedBox(
width: 10,
),
ElevatedButton(
onPressed: () {
setState(() {
abbauDat = null;
});
},
child: const Text("X"))
]),
],
)
],
);
}
Future<DateTime?> pickDate() async {
final date = await showDatePicker(
context: context,
initialDate: DateTime.now(),
firstDate: DateTime(2000),
lastDate: DateTime(5000));
if (date == null) return null;
return date;
}
}

View File

@@ -0,0 +1,79 @@
import 'package:flutter/material.dart';
import 'package:flutter_gen/gen_l10n/app_localizations.dart';
class AbbauDat extends StatefulWidget {
final DateTime? initAbbauDat;
final Function(DateTime) onDateChanged;
const AbbauDat({super.key, required this.initAbbauDat, required this.onDateChanged});
@override
State<AbbauDat> createState() => _AbbauDatState();
}
class _AbbauDatState extends State<AbbauDat> {
DateTime? abbauDat;
@override
void initState() {
super.initState();
abbauDat = widget.initAbbauDat;
}
@override
Widget build(BuildContext context) {
return Row(
children: [
Column(children: [
SizedBox(
width: 140,
child: ElevatedButton(
onPressed: () async {
final date = await pickDate();
if (date == null) return;
setState(() => abbauDat = date);
widget.onDateChanged(date);
},
child: Text(AppLocalizations.of(context)!.pickabbaudat)),
),
Row(
children: [
const SizedBox(
width: 10,
),
Builder(builder: (context) {
if (abbauDat != null) {
return Text(
'${abbauDat?.day}. ${abbauDat?.month}. ${abbauDat?.year}');
} else {
return Text(AppLocalizations.of(context)!.nichts);
}
}),
const SizedBox(
width: 10,
),
ElevatedButton(
onPressed: () {
setState(() {
abbauDat = null;
});
},
child: const Text("X"))
]),
],
)
],
);
}
Future<DateTime?> pickDate() async {
final date = await showDatePicker(
context: context,
initialDate: DateTime.now(),
firstDate: DateTime(2000),
lastDate: DateTime(5000));
if (date == null) return null;
return date;
}
}

View File

@@ -0,0 +1,61 @@
import 'package:flutter/material.dart';
import 'package:flutter_gen/gen_l10n/app_localizations.dart';
class FotoFilm extends StatefulWidget {
final Function(String) onFotoFilmChanged;
final String initialFotoFilm;
const FotoFilm(
{super.key,
required this.onFotoFilmChanged,
this.initialFotoFilm = 'foto'});
@override
State<FotoFilm> createState() => _FotoFilmState();
}
class _FotoFilmState extends State<FotoFilm> {
String? _selectedFotoFilm;
@override
void initState() {
super.initState();
_selectedFotoFilm = widget.initialFotoFilm;
}
@override
Widget build(BuildContext context) {
return Column(
children: [
ListTile(
visualDensity: const VisualDensity(vertical: -4),
title: Text(AppLocalizations.of(context)!.foto),
leading: Radio<String>(
value: 'Foto',
groupValue: _selectedFotoFilm,
onChanged: (value) {
setState(() {
_selectedFotoFilm = value;
widget.onFotoFilmChanged(value!);
});
},
),
),
ListTile(
visualDensity: const VisualDensity(vertical: -4),
title: Text(AppLocalizations.of(context)!.film),
leading: Radio<String>(
value: 'Film',
groupValue: _selectedFotoFilm,
onChanged: (value) {
setState(() {
_selectedFotoFilm = value;
widget.onFotoFilmChanged(value!);
});
},
),
),
],
);
}
}

View File

@@ -0,0 +1,111 @@
import 'package:fforte/screens/helper/snack_bar_helper.dart';
import 'package:flutter/material.dart';
import 'package:flutter_map/flutter_map.dart';
import 'package:geolocator/geolocator.dart';
import 'package:latlong2/latlong.dart';
import 'package:geocoding/geocoding.dart';
import 'package:flutter_gen/gen_l10n/app_localizations.dart';
class Karte extends StatefulWidget {
final TextEditingController beiOrtC;
final TextEditingController ortInfoC;
final TextEditingController decLngC;
final TextEditingController decLatC;
final Position currentPosition;
const Karte(
{super.key,
required this.currentPosition,
required this.beiOrtC,
required this.ortInfoC,
required this.decLngC,
required this.decLatC});
@override
KarteState createState() => KarteState();
}
class KarteState extends State<Karte> {
Marker? currentMarker;
bool saveVisible = false;
@override
void initState() {
super.initState();
currentMarker = Marker(
point: LatLng(
widget.currentPosition.latitude, widget.currentPosition.longitude),
child: const Icon(
Icons.location_on,
color: Colors.red,
));
}
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text(AppLocalizations.of(context)!.map),
actions: [
Visibility(
visible: saveVisible,
child: Row(
children: [
Text(AppLocalizations.of(context)!.saveMap),
TextButton(
onPressed: () async {
if (currentMarker != null) {
setState(() {
widget.decLatC.text =
currentMarker!.point.latitude.toString();
widget.decLngC.text =
currentMarker!.point.longitude.toString();
});
}
if (context.mounted) Navigator.pop(context);
},
child: const Icon(Icons.save),
),
],
),
),
],
),
body: FlutterMap(
mapController: MapController(),
options: MapOptions(
interactionOptions: const InteractionOptions(
flags: InteractiveFlag.pinchZoom |
InteractiveFlag.drag |
InteractiveFlag.pinchMove),
initialCenter: LatLng(widget.currentPosition.latitude,
widget.currentPosition.longitude),
initialZoom: 16.0,
onTap: _handleTap,
),
children: [
TileLayer(
urlTemplate: 'https://tile.openstreetmap.org/{z}/{x}/{y}.png',
userAgentPackageName: 'com.example.app',
),
MarkerLayer(markers: currentMarker != null ? [currentMarker!] : []),
]),
);
}
_handleTap(TapPosition position, LatLng latlng) {
setState(() {
currentMarker = Marker(
width: 80.0,
height: 80.0,
point: latlng,
child: const Icon(
Icons.location_on,
color: Colors.red,
),
);
saveVisible = true;
});
}
}

View File

@@ -0,0 +1,62 @@
import 'package:flutter/material.dart';
import 'package:flutter_gen/gen_l10n/app_localizations.dart';
class KontDat extends StatefulWidget {
final DateTime? initKontDat;
final Function(DateTime) onDateChanged;
const KontDat(
{super.key, required this.initKontDat, required this.onDateChanged});
@override
State<KontDat> createState() => _KontDatState();
}
class _KontDatState extends State<KontDat> {
DateTime? kontDat;
@override
void initState() {
super.initState();
kontDat = widget.initKontDat;
}
@override
Widget build(BuildContext context) {
return Row(
children: [
Row(children: [
SizedBox(
width: 140,
child: ElevatedButton(
onPressed: () async {
final date = await pickDate();
if (date == null) return;
setState(() {
kontDat = date;
});
widget.onDateChanged(date);
},
child: Text(AppLocalizations.of(context)!.pickkontdat)),
),
const SizedBox(
width: 10,
),
Text(
'${kontDat?.day}. ${kontDat?.month}. ${kontDat?.year}',
),
]),
],
);
}
Future<DateTime?> pickDate() async {
final date = await showDatePicker(
context: context,
initialDate: kontDat ?? DateTime.now(),
firstDate: DateTime(2000),
lastDate: DateTime(5000));
return date;
}
}

View File

@@ -0,0 +1,59 @@
import 'package:flutter/material.dart';
import 'package:flutter_gen/gen_l10n/app_localizations.dart';
class MEZ extends StatefulWidget {
final Function(String) onMEZChanged;
final String initialMEZ;
const MEZ(
{super.key, required this.onMEZChanged, this.initialMEZ = 'sommerzeit'});
@override
State<MEZ> createState() => _MEZState();
}
class _MEZState extends State<MEZ> {
String? _selectedMEZ;
@override
void initState() {
super.initState();
_selectedMEZ = widget.initialMEZ;
}
@override
Widget build(BuildContext context) {
return Column(
children: [
ListTile(
visualDensity: const VisualDensity(vertical: -4),
title: Text(AppLocalizations.of(context)!.sommerzeit),
leading: Radio<String>(
value: 'Sommerzeit',
groupValue: _selectedMEZ,
onChanged: (value) {
setState(() {
_selectedMEZ = value;
widget.onMEZChanged(value!);
});
},
),
),
ListTile(
visualDensity: const VisualDensity(vertical: -4),
title: Text(AppLocalizations.of(context)!.winterzeit),
leading: Radio<String>(
value: 'Winterzeit',
groupValue: _selectedMEZ,
onChanged: (value) {
setState(() {
_selectedMEZ = value;
widget.onMEZChanged(value!);
});
},
),
),
],
);
}
}

View File

@@ -0,0 +1,134 @@
import 'package:flutter/material.dart';
import 'package:flutter_gen/gen_l10n/app_localizations.dart';
class Platzung extends StatefulWidget {
final Function(String) onPlatzungChanged;
final String? initialPlatzung;
const Platzung({
super.key,
required this.onPlatzungChanged,
this.initialPlatzung,
});
@override
State<Platzung> createState() => _PlatzungState();
}
class _PlatzungState extends State<Platzung> {
String? _selectedPlatzung;
@override
void initState() {
super.initState();
if (widget.initialPlatzung != "") {
_selectedPlatzung = widget.initialPlatzung;
}
}
@override
Widget build(BuildContext context) {
return Column(
children: [
ListTile(
visualDensity: const VisualDensity(vertical: -4),
title: Text(AppLocalizations.of(context)!.kirrung),
leading: Radio<String>(
value: 'Kirrung',
groupValue: _selectedPlatzung,
onChanged: (value) {
setState(() {
_selectedPlatzung = value;
widget.onPlatzungChanged(value!);
});
},
),
),
ListTile(
visualDensity: const VisualDensity(vertical: -4),
title: Text(AppLocalizations.of(context)!.wasserstelle),
leading: Radio<String>(
value: 'Wasserstelle',
groupValue: _selectedPlatzung,
onChanged: (value) {
setState(() {
_selectedPlatzung = value;
widget.onPlatzungChanged(value!);
});
},
),
),
ListTile(
visualDensity: const VisualDensity(vertical: -4),
title: Text(AppLocalizations.of(context)!.wald),
leading: Radio<String>(
value: 'Wald',
groupValue: _selectedPlatzung,
onChanged: (value) {
setState(() {
_selectedPlatzung = value;
widget.onPlatzungChanged(value!);
});
},
),
),
ListTile(
visualDensity: const VisualDensity(vertical: -4),
title: Text(AppLocalizations.of(context)!.wildwechsel),
leading: Radio<String>(
value: 'Wildwechsel',
groupValue: _selectedPlatzung,
onChanged: (value) {
setState(() {
_selectedPlatzung = value;
widget.onPlatzungChanged(value!);
});
},
),
),
ListTile(
visualDensity: const VisualDensity(vertical: -4),
title: Text(AppLocalizations.of(context)!.wegstrasse),
leading: Radio<String>(
value: 'Weg/Straße',
groupValue: _selectedPlatzung,
onChanged: (value) {
setState(() {
_selectedPlatzung = value;
widget.onPlatzungChanged(value!);
});
},
),
),
ListTile(
visualDensity: const VisualDensity(vertical: -4),
title: Text(AppLocalizations.of(context)!.hofgarten),
leading: Radio<String>(
value: 'Hof/Garten',
groupValue: _selectedPlatzung,
onChanged: (value) {
setState(() {
_selectedPlatzung = value;
widget.onPlatzungChanged(value!);
});
},
),
),
ListTile(
visualDensity: const VisualDensity(vertical: -4),
title: Text(AppLocalizations.of(context)!.wiesefeld),
leading: Radio<String>(
value: 'Wiese/Feld/Offenfläche',
groupValue: _selectedPlatzung,
onChanged: (value) {
setState(() {
_selectedPlatzung = value;
widget.onPlatzungChanged(value!);
});
},
),
),
],
);
}
}

View File

@@ -0,0 +1,58 @@
import 'package:flutter/material.dart';
import 'package:flutter_gen/gen_l10n/app_localizations.dart';
class Status extends StatefulWidget {
final Function(String) onStatusChanged;
final String initialStatus;
const Status(
{super.key, required this.onStatusChanged, this.initialStatus = 'Aktiv'});
@override
State<Status> createState() => _StatusState();
}
class _StatusState extends State<Status> {
String? _selectedStatus;
@override
void initState() {
super.initState();
_selectedStatus = widget.initialStatus;
}
@override
Widget build(BuildContext context) {
return Column(
children: [
ListTile(
visualDensity: const VisualDensity(vertical: -4),
title: Text(AppLocalizations.of(context)!.aktiv),
leading: Radio<String>(
value: 'aktiv',
groupValue: _selectedStatus,
onChanged: (value) {
setState(() {
_selectedStatus = value;
widget.onStatusChanged(value!);
});
},
),
),
ListTile(
visualDensity: const VisualDensity(vertical: -4),
title: Text(AppLocalizations.of(context)!.inaktiv),
leading: Radio<String>(
value: 'inaktiv',
groupValue: _selectedStatus,
onChanged: (value) {
setState(() {
_selectedStatus = value;
widget.onStatusChanged(value!);
});
},
),
),
],
);
}
}

View File

@@ -0,0 +1,61 @@
import 'package:flutter/material.dart';
import 'package:flutter_gen/gen_l10n/app_localizations.dart';
class STTyp extends StatefulWidget {
final Function(String) onSTTypChanged;
final String initialSTTyp;
const STTyp(
{super.key,
required this.onSTTypChanged,
this.initialSTTyp = 'opportunistisch'});
@override
State<STTyp> createState() => _STTypState();
}
class _STTypState extends State<STTyp> {
String? _selectedSTTyp;
@override
void initState() {
super.initState();
_selectedSTTyp = widget.initialSTTyp;
}
@override
Widget build(BuildContext context) {
return Column(
children: [
ListTile(
visualDensity: const VisualDensity(vertical: -4),
title: Text(AppLocalizations.of(context)!.opportunistisch),
leading: Radio<String>(
value: 'opportunistisch',
groupValue: _selectedSTTyp,
onChanged: (value) {
setState(() {
_selectedSTTyp = value;
widget.onSTTypChanged(value!);
});
},
),
),
ListTile(
visualDensity: const VisualDensity(vertical: -4),
title: Text(AppLocalizations.of(context)!.systematisch),
leading: Radio<String>(
value: 'systematisch',
groupValue: _selectedSTTyp,
onChanged: (value) {
setState(() {
_selectedSTTyp = value;
widget.onSTTypChanged(value!);
});
},
),
),
],
);
}
}

View File

@@ -78,3 +78,4 @@
6. mai 2h 15min
7. mai 2h 45min
9. mai 3h 40min
10.mai 2h