Flutter-Benutzereingabe
In diesem Abschnitt wird erläutert, wie Benutzereingaben in Flutter-Anwendungen verarbeitet werden, einschließlich Texteingabe, Schaltflächenklicks, Formularverarbeitung und mehr.
TextField - Texteingabe
TextField ist das am häufigsten verwendete Texteingabe-Widget in Flutter.
Beispiel: Grundlegende Verwendung von TextField
// Das einfachste TextField
TextField()
// TextField mit Dekoration
TextField(
decoration: const InputDecoration(
labelText: Benutzername, // Beschriftung
hintText: 'Bitte Benutzernamen eingeben', // Hinweistext
prefixIcon: Icon(Icons.person), // Präfix-Symbol
),
)
// TextField mit Rahmen
TextField(
decoration: InputDecoration(
border: OutlineInputBorder( // Äußerer Rahmen
borderRadius: BorderRadius.circular(8),
),
labelText: Passwort,
),
obscureText: true, // Eingabeinhalt ausblenden (Passwortszenario)
)
// Mehrzeilige Texteingabe
TextField(
maxLines: 3, // Maximale Zeilen
decoration: const InputDecoration(
hintText: 'Bitte mehrzeiligen Text eingeben',
),
)
TextField()
// TextField mit Dekoration
TextField(
decoration: const InputDecoration(
labelText: Benutzername, // Beschriftung
hintText: 'Bitte Benutzernamen eingeben', // Hinweistext
prefixIcon: Icon(Icons.person), // Präfix-Symbol
),
)
// TextField mit Rahmen
TextField(
decoration: InputDecoration(
border: OutlineInputBorder( // Äußerer Rahmen
borderRadius: BorderRadius.circular(8),
),
labelText: Passwort,
),
obscureText: true, // Eingabeinhalt ausblenden (Passwortszenario)
)
// Mehrzeilige Texteingabe
TextField(
maxLines: 3, // Maximale Zeilen
decoration: const InputDecoration(
hintText: 'Bitte mehrzeiligen Text eingeben',
),
)
TextEditingController - Text-Controller
Mit TextEditingController können Sie den Inhalt von TextField lesen und steuern.
< h2 class="example">Beispiel: Verwendung von TextEditingController
class TextFieldExample extends StatefulWidget {
const TextFieldExample({super.key});
@override
State<TextFieldExample> createState() => _TextFieldExampleState();
}
class _TextFieldExampleState extends State<TextFieldExample> {
// Controller erstellen
final TextEditingController _controller = TextEditingController();
String _displayText = '';
@override
void dispose() {
// Controller freigeben
_controller.dispose();
super.dispose();
}
@override
Widget build(BuildContext context) {
return Column(
children: [
TextField(
controller: _controller, // Controller binden
decoration: const InputDecoration(
labelText: 'Text eingeben',
),
onChanged: (text) {
// Auf Textänderungen lauschen
print('Aktuelle Eingabe: $text');
},
),
const SizedBox(height: 20),
// Eingabetext anzeigen
Text('Sie haben eingegeben: $_displayText'),
const SizedBox(height: 20),
ElevatedButton(
onPressed: () {
// Text lesen
setState(() {
_displayText = _controller.text;
});
},
child: const Text('Eingabe anzeigen'),
),
ElevatedButton(
onPressed: () {
// Text löschen
_controller.clear();
},
child: const Text('Leeren'),
),
ElevatedButton(
onPressed: () {
// Text setzen
_controller.text = 'Vorgegebener Text';
},
child: const Text('Set text'),
),
],
);
}
}
const TextFieldExample({super.key});
@override
State<TextFieldExample> createState() => _TextFieldExampleState();
}
class _TextFieldExampleState extends State<TextFieldExample> {
// Controller erstellen
final TextEditingController _controller = TextEditingController();
String _displayText = '';
@override
void dispose() {
// Controller freigeben
_controller.dispose();
super.dispose();
}
@override
Widget build(BuildContext context) {
return Column(
children: [
TextField(
controller: _controller, // Controller binden
decoration: const InputDecoration(
labelText: 'Text eingeben',
),
onChanged: (text) {
// Auf Textänderungen lauschen
print('Aktuelle Eingabe: $text');
},
),
const SizedBox(height: 20),
// Eingabetext anzeigen
Text('Sie haben eingegeben: $_displayText'),
const SizedBox(height: 20),
ElevatedButton(
onPressed: () {
// Text lesen
setState(() {
_displayText = _controller.text;
});
},
child: const Text('Eingabe anzeigen'),
),
ElevatedButton(
onPressed: () {
// Text löschen
_controller.clear();
},
child: const Text('Leeren'),
),
ElevatedButton(
onPressed: () {
// Text setzen
_controller.text = 'Vorgegebener Text';
},
child: const Text('Set text'),
),
],
);
}
}
Fokussteuerung
Mit FocusNode können Sie den Fokus von Eingabefeldern steuern.
Beispiel: Fokussteuerung
class FocusExample extends StatefulWidget {
const FocusExample({super.key});
@override
State<FocusExample> createState() => _FocusExampleState();
}
class _FocusExampleState extends State<FocusExample> {
final FocusNode _focusNode1 = FocusNode();
final FocusNode _focusNode2 = FocusNode();
@override
void dispose() {
_focusNode1.dispose();
_focusNode2.dispose();
super.dispose();
}
@override
Widget build(BuildContext context) {
return Column(
children: [
TextField(
focusNode: _focusNode1,
decoration: const InputDecoration(labelText: 'Eingabefeld 1'),
),
const SizedBox(height: 10),
TextField(
focusNode: _focusNode2,
decoration: const InputDecoration(labelText: 'Eingabefeld 2'),
),
const SizedBox(height: 20),
ElevatedButton(
onPressed: () {
// Eingabefeld 1 fokussieren
_focusNode1.requestFocus();
},
child: const Text('Eingabefeld 1 fokussieren'),
),
ElevatedButton(
onPressed: () {
// Eingabefeld 2 fokussieren
_focusNode2.requestFocus();
},
child: const Text('Eingabefeld 2 fokussieren'),
),
ElevatedButton(
onPressed: () {
// Fokus entfernen
_focusNode1.unfocus();
_focusNode2.unfocus();
},
child: const Text('Fokus entfernen'),
),
],
);
}
}
const FocusExample({super.key});
@override
State<FocusExample> createState() => _FocusExampleState();
}
class _FocusExampleState extends State<FocusExample> {
final FocusNode _focusNode1 = FocusNode();
final FocusNode _focusNode2 = FocusNode();
@override
void dispose() {
_focusNode1.dispose();
_focusNode2.dispose();
super.dispose();
}
@override
Widget build(BuildContext context) {
return Column(
children: [
TextField(
focusNode: _focusNode1,
decoration: const InputDecoration(labelText: 'Eingabefeld 1'),
),
const SizedBox(height: 10),
TextField(
focusNode: _focusNode2,
decoration: const InputDecoration(labelText: 'Eingabefeld 2'),
),
const SizedBox(height: 20),
ElevatedButton(
onPressed: () {
// Eingabefeld 1 fokussieren
_focusNode1.requestFocus();
},
child: const Text('Eingabefeld 1 fokussieren'),
),
ElevatedButton(
onPressed: () {
// Eingabefeld 2 fokussieren
_focusNode2.requestFocus();
},
child: const Text('Eingabefeld 2 fokussieren'),
),
ElevatedButton(
onPressed: () {
// Fokus entfernen
_focusNode1.unfocus();
_focusNode2.unfocus();
},
child: const Text('Fokus entfernen'),
),
],
);
}
}
Schaltflächen und Klickereignisse
Flutter bietet eine Vielzahl von Schaltflächenkomponenten zur Behandlung von Benutzerklicks.
Beispiel: Verschiedene Schaltflächen
// TextButton - Textschaltfläche
TextButton(
onPressed: () => print('Textschaltfläche angeklickt'),
child: const Text('Textschaltfläche'),
)
// ElevatedButton - erhöhte Schaltfläche
ElevatedButton(
onPressed: () => print('Erhöhte Schaltfläche angeklickt'),
child: const Text('Absenden'),
)
// OutlinedButton - Umriss-Schaltfläche
OutlinedButton(
onPressed: () => print('Umriss-Schaltfläche angeklickt'),
child: const Text('Abbrechen'),
)
// IconButton - Symbolschaltfläche
IconButton(
icon: const Icon(Icons.favorite),
onPressed: () => print('Symbolschaltfläche angeklickt'),
)
// Schaltfläche mit Symbol
ElevatedButton.icon(
onPressed: () => print('Schaltfläche mit Symbol angeklickt'),
icon: const Icon(Icons.save),
label: const Text('Speichern'),
)
// CupertinoButton - Button im iOS-Stil
CupertinoButton(
child: const Text('iOS-Button'),
onPressed: () {},
)
TextButton(
onPressed: () => print('Textschaltfläche angeklickt'),
child: const Text('Textschaltfläche'),
)
// ElevatedButton - erhöhte Schaltfläche
ElevatedButton(
onPressed: () => print('Erhöhte Schaltfläche angeklickt'),
child: const Text('Absenden'),
)
// OutlinedButton - Umriss-Schaltfläche
OutlinedButton(
onPressed: () => print('Umriss-Schaltfläche angeklickt'),
child: const Text('Abbrechen'),
)
// IconButton - Symbolschaltfläche
IconButton(
icon: const Icon(Icons.favorite),
onPressed: () => print('Symbolschaltfläche angeklickt'),
)
// Schaltfläche mit Symbol
ElevatedButton.icon(
onPressed: () => print('Schaltfläche mit Symbol angeklickt'),
icon: const Icon(Icons.save),
label: const Text('Speichern'),
)
// CupertinoButton - Button im iOS-Stil
CupertinoButton(
child: const Text('iOS-Button'),
onPressed: () {},
)
Switch, Checkbox, Radio
Beispiel: Switch, Checkbox, Radio-Button
class SwitchCheckboxExample extends StatefulWidget {
const SwitchCheckboxExample({super.key});
@override
State<SwitchCheckboxExample> createState() => _SwitchCheckboxExampleState();
}
class _SwitchCheckboxExampleState extends State<SwitchCheckboxExample> {
bool _switchValue = false;
bool _checkboxValue = false;
String _radioValue = 'A';
@override
Widget build(BuildContext context) {
return Column(
children: [
// Switch - umschalten
Switch(
value: _switchValue,
onChanged: (value) {
setState(() {
_switchValue = value;
});
},
),
Text('Switch-Wert: $_switchValue'),
// Checkbox - Kontrollkästchen
Kontrollkästchen(
value: _checkboxValue,
onChanged: (value) {
setState(() {
_checkboxValue = value ?? false;
});
},
),
Text('Checkbox-Wert: $_checkboxValue'),
// Radio - Radiobutton
Row(
children: [
Radio<String>(
value: 'A',
groupValue: _radioValue,
onChanged: (value) {
setState(() {
_radioValue = Wert!;
});
},
),
const Text('Option A'),
Radio<String>(
value: 'B',
groupValue: _radioValue,
onChanged: (value) {
setState(() {
_radioValue = Wert!;
});
},
),
const Text('Option B'),
],
),
Text('Radio-Wert: $_radioValue'),
],
);
}
}
const SwitchCheckboxExample({super.key});
@override
State<SwitchCheckboxExample> createState() => _SwitchCheckboxExampleState();
}
class _SwitchCheckboxExampleState extends State<SwitchCheckboxExample> {
bool _switchValue = false;
bool _checkboxValue = false;
String _radioValue = 'A';
@override
Widget build(BuildContext context) {
return Column(
children: [
// Switch - umschalten
Switch(
value: _switchValue,
onChanged: (value) {
setState(() {
_switchValue = value;
});
},
),
Text('Switch-Wert: $_switchValue'),
// Checkbox - Kontrollkästchen
Kontrollkästchen(
value: _checkboxValue,
onChanged: (value) {
setState(() {
_checkboxValue = value ?? false;
});
},
),
Text('Checkbox-Wert: $_checkboxValue'),
// Radio - Radiobutton
Row(
children: [
Radio<String>(
value: 'A',
groupValue: _radioValue,
onChanged: (value) {
setState(() {
_radioValue = Wert!;
});
},
),
const Text('Option A'),
Radio<String>(
value: 'B',
groupValue: _radioValue,
onChanged: (value) {
setState(() {
_radioValue = Wert!;
});
},
),
const Text('Option B'),
],
),
Text('Radio-Wert: $_radioValue'),
],
);
}
}
Slider - Slider
Beispiel: Slider-Verwendung
class SliderExample extends StatefulWidget {
const SliderExample({super.key});
@override
State<SliderExample> createState() => _SliderExampleState();
}
class _SliderExampleState extends State<SliderExample> {
double _sliderValue = 0.5;
@override
Widget build(BuildContext context) {
return Column(
children: [
Slider(
value: _sliderValue, // Aktueller Wert (0.0-1.0)
min: 0.0,
max: 1.0,
divisions: 10, // In 10 Teilstriche unterteilen
label: '${(_sliderValue * 100).round()}%',
onChanged: (value) {
setState(() {
_sliderValue = value;
});
},
),
Text('Aktueller Wert: ${(_sliderValue * 100).round()}%'),
// Bereichs-Slider
RangeSlider(
values: const RangeValues(0.3, 0.7),
min: 0.0,
max: 1.0,
onChanged: (values) {
print('Bereich: ${values.start} - ${values.end}');
},
),
],
);
}
}
const SliderExample({super.key});
@override
State<SliderExample> createState() => _SliderExampleState();
}
class _SliderExampleState extends State<SliderExample> {
double _sliderValue = 0.5;
@override
Widget build(BuildContext context) {
return Column(
children: [
Slider(
value: _sliderValue, // Aktueller Wert (0.0-1.0)
min: 0.0,
max: 1.0,
divisions: 10, // In 10 Teilstriche unterteilen
label: '${(_sliderValue * 100).round()}%',
onChanged: (value) {
setState(() {
_sliderValue = value;
});
},
),
Text('Aktueller Wert: ${(_sliderValue * 100).round()}%'),
// Bereichs-Slider
RangeSlider(
values: const RangeValues(0.3, 0.7),
min: 0.0,
max: 1.0,
onChanged: (values) {
print('Bereich: ${values.start} - ${values.end}');
},
),
],
);
}
}
Weitere ErweiterungenWenn du Benutzereingaben verarbeitest, denke daran, setState zu verwenden, um den UI-Zustand zu aktualisieren, damit die Oberfläche auf Benutzeraktionen reagieren kann.