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 createState() => _VarTextFieldState(); } class _VarTextFieldState extends State { late Future>> 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>> _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>>( future: dbVar, builder: (BuildContext context, AsyncSnapshot>> 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( onSelected: (String value) { setState(() { widget.textController.text = value; }); }, itemBuilder: (BuildContext context) { return uniqueData .map((value) => PopupMenuItem( 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(); } }, ), ), ) ], ); } }