import 'package:flutter/material.dart'; import 'package:flutter_login/flutter_login_view.dart'; abstract class DropDownInput extends Input { const DropDownInput({ required this.value, required this.entries, List> inputValidators = const [], OnInputChange? onChange, String? title, String? description, super.key, }) : super( inputValidators: inputValidators, title: title, description: description, onChange: onChange, ); final V? value; final Map entries; @override State createState() => DropDownState(entries: entries, initialValue: value); } class DropDownState extends InputState { DropDownState({ required this.entries, required V initialValue, }) : super(initialValue); final Map entries; @override Widget build(BuildContext context) { return GestureDetector( onTap: requestFocus, child: widget.createInputShell( context, input: DropdownButtonHideUnderline( child: DropdownButton( selectedItemBuilder: (BuildContext context) { return entries .map( (value, text) => MapEntry( value, DropdownMenuItem( value: value, child: Text( context.translate(text), style: Theme.of(context).textTheme.subtitle1, ), ), ), ) .values .toList(); }, value: value, isDense: true, isExpanded: true, onChanged: (value) { if (value != null) { setState(() { this.value = value; }); widget.change(value, validate()); } }, items: entries .map( (value, text) => MapEntry( value, DropdownMenuItem( value: value, child: Text( context.translate(text), style: Theme.of(context).textTheme.subtitle2, ), ), ), ) .values .toList(), focusNode: focusNode, ), ), error: createErrorLabel(), title: createTitle(), description: createDescription(), focused: focusNode.hasFocus, ), ); } }