Maximale Input in Textfelder gefixtx #176

Merged
sneeex merged 3 commits from hotifx/fix-input-length into development 2026-01-18 13:49:53 +00:00
3 changed files with 16 additions and 7 deletions

View File

@@ -84,6 +84,7 @@ class _PlayerSelectionState extends State<PlayerSelection> {
crossAxisAlignment: CrossAxisAlignment.start, crossAxisAlignment: CrossAxisAlignment.start,
children: [ children: [
CustomSearchBar( CustomSearchBar(
maxLength: Constants.MAX_PLAYER_NAME_LENGTH,
controller: _searchBarController, controller: _searchBarController,
constraints: const BoxConstraints(maxHeight: 45, minHeight: 45), constraints: const BoxConstraints(maxHeight: 45, minHeight: 45),
hintText: loc.search_for_players, hintText: loc.search_for_players,

View File

@@ -1,5 +1,4 @@
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:game_tracker/core/constants.dart';
import 'package:game_tracker/core/custom_theme.dart'; import 'package:game_tracker/core/custom_theme.dart';
class CustomSearchBar extends StatelessWidget { class CustomSearchBar extends StatelessWidget {
@@ -22,6 +21,7 @@ class CustomSearchBar extends StatelessWidget {
this.onTrailingButtonPressed, this.onTrailingButtonPressed,
this.onChanged, this.onChanged,
this.constraints, this.constraints,
this.maxLength,
}); });
/// The controller for the search bar's text input. /// The controller for the search bar's text input.
@@ -48,15 +48,19 @@ class CustomSearchBar extends StatelessWidget {
/// The constraints for the search bar. /// The constraints for the search bar.
final BoxConstraints? constraints; final BoxConstraints? constraints;
/// Optional parameter for maximum length of the input text.
final int? maxLength;
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
/// Enforce maximum length on the input text /// Enforce maximum length on the input text
const maxLength = Constants.MAX_PLAYER_NAME_LENGTH; if (maxLength != null) {
if (controller.text.length > maxLength) { if (controller.text.length > maxLength!) {
controller.text = controller.text.substring(0, maxLength); controller.text = controller.text.substring(0, maxLength);
controller.selection = TextSelection.fromPosition( controller.selection = TextSelection.fromPosition(
TextPosition(offset: controller.text.length), TextPosition(offset: controller.text.length),
); );
}
} }
return SearchBar( return SearchBar(

View File

@@ -1,4 +1,5 @@
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:flutter/services.dart';
import 'package:game_tracker/core/custom_theme.dart'; import 'package:game_tracker/core/custom_theme.dart';
class TextInputField extends StatelessWidget { class TextInputField extends StatelessWidget {
@@ -33,11 +34,14 @@ class TextInputField extends StatelessWidget {
controller: controller, controller: controller,
onChanged: onChanged, onChanged: onChanged,
maxLength: maxLength, maxLength: maxLength,
maxLengthEnforcement: MaxLengthEnforcement.truncateAfterCompositionEnds,
decoration: InputDecoration( decoration: InputDecoration(
filled: true, filled: true,
fillColor: CustomTheme.boxColor, fillColor: CustomTheme.boxColor,
hintText: hintText, hintText: hintText,
hintStyle: const TextStyle(fontSize: 18), hintStyle: const TextStyle(fontSize: 18),
// Hides the character counter
counterText: '',
enabledBorder: OutlineInputBorder( enabledBorder: OutlineInputBorder(
borderRadius: const BorderRadius.all(Radius.circular(12)), borderRadius: const BorderRadius.all(Radius.circular(12)),
borderSide: BorderSide(color: CustomTheme.boxBorder), borderSide: BorderSide(color: CustomTheme.boxBorder),