Files
fforte/lib/screens/sharedWidgets/var_text_field.dart
2024-11-22 21:10:42 +01:00

147 lines
4.9 KiB
Dart

import 'package:fforte/methods/db_helper.dart';
import 'package:flutter/material.dart';
import 'package:shared_preferences/shared_preferences.dart';
class VarTextField extends StatefulWidget {
final TextEditingController textController;
final String localization;
final String dbName;
final String? defaultValue;
final String? otherDefault;
final bool required;
const VarTextField(
{super.key,
required this.textController,
required this.localization,
required this.dbName,
required this.required,
this.defaultValue,
this.otherDefault});
@override
State<VarTextField> createState() => _VarTextFieldState();
}
class _VarTextFieldState extends State<VarTextField> {
late Future<List<Map<String, dynamic>>> dbVar;
@override
void initState() {
super.initState();
if (widget.textController.text == "" && widget.defaultValue != null) {
_loadPref();
}
if (widget.otherDefault != null) {
widget.textController.text = widget.otherDefault!;
}
dbVar = _loadData();
}
Future<List<Map<String, dynamic>>> _loadData() async {
var places = await DBHelper().getPlace();
var templates = await DBHelper().getTemplates();
return [...places, ...templates];
}
void _loadPref() {
Future.delayed(Duration.zero, () async {
SharedPreferences prefs = await SharedPreferences.getInstance();
String bLand = prefs.getString(widget.defaultValue!) ?? "";
setState(() {
widget.textController.text = bLand;
});
});
}
@override
Widget build(BuildContext context) {
return Row(
children: [
Expanded(
flex: 5,
child: TextField(
controller: widget.textController,
keyboardType: TextInputType.multiline,
maxLines: null,
onChanged: (value) {
setState(() {
widget.textController.text = value;
});
},
decoration: InputDecoration(
hintText: widget.localization,
enabledBorder: widget.required
? (widget.textController.text.isEmpty
? const UnderlineInputBorder(
borderSide: BorderSide(color: Colors.red))
: const UnderlineInputBorder(
borderSide: BorderSide(color: Colors.green)))
: const UnderlineInputBorder(
borderSide: BorderSide(color: Colors.grey)),
focusedBorder: widget.required
? (widget.textController.text.isEmpty
? const UnderlineInputBorder(
borderSide: BorderSide(color: Colors.red))
: const UnderlineInputBorder(
borderSide: BorderSide(color: Colors.green)))
: const UnderlineInputBorder(
borderSide: BorderSide(color: Colors.grey))),
)),
const Expanded(
child: SizedBox(
width: 15,
),
),
Expanded(
flex: 1,
child: Align(
alignment: Alignment.bottomLeft,
child: FutureBuilder<List<Map<String, dynamic>>>(
future: dbVar,
builder: (BuildContext context,
AsyncSnapshot<List<Map<String, dynamic>>> snapshot) {
if (snapshot.hasData) {
// Filtern der Daten, um sicherzustellen, dass keine 'null' Werte für den Schlüssel dbName vorhanden sind
var filteredData = snapshot.data!
.where((item) =>
item[widget.dbName] != null &&
item[widget.dbName] != "")
.toList();
var uniqueData = { ...filteredData.map((e) => e[widget.dbName].toString())};
return PopupMenuButton<String>(
onSelected: (String value) {
setState(() {
widget.textController.text = value;
});
},
itemBuilder: (BuildContext context) {
return uniqueData
.map((value) => PopupMenuItem<String>(
value: value,
child: Text(value),
))
.toList();
},
child: const Icon(Icons.arrow_drop_down),
);
} else if (snapshot.hasError) {
return Text('Fehler: ${snapshot.error}');
} else {
return const CircularProgressIndicator();
}
},
),
),
)
],
);
}
}