import 'package:flutter/material.dart'; import 'package:flutter/widgets.dart'; class EnumParam extends StatelessWidget { final String title; final String? description; final T initial; final List values; final Function(T v) onChanged; final Function(T v)? getName; EnumParam( this.title, this.values, this.initial, this.onChanged, { this.description, this.getName, }); String _defaultName(T v) => ((v is Enum) ? v.name : v.toString()); @override Widget build(BuildContext context) { T value = initial; return Padding( padding: const EdgeInsets.all(8.0), child: Row( children: [ Column( mainAxisAlignment: MainAxisAlignment.center, crossAxisAlignment: CrossAxisAlignment.start, children: [ Text(title), if (description != null) Text( description!, style: TextStyle(fontSize: 12), ) ], ), SizedBox( width: 2, ), Expanded( child: StatefulBuilder(builder: (context, setState) { return DropdownButton( value: value, items: values .map( (v) => DropdownMenuItem( child: Text(getName?.call(v) ?? _defaultName(v)), value: v, ), ) .toList(), onChanged: (v) => setState(() { value = v!; onChanged(v); }), ); }), ) ], ), ); } }