mirror of
https://gitlab.com/veilid/veilidchat.git
synced 2025-07-06 03:54:55 -04:00
59 lines
1.8 KiB
Dart
59 lines
1.8 KiB
Dart
import 'package:async_tools/async_tools.dart';
|
|
import 'package:awesome_extensions/awesome_extensions_flutter.dart';
|
|
import 'package:flutter/material.dart';
|
|
|
|
import '../../models/models.dart';
|
|
import '../views.dart';
|
|
|
|
const _kStyledDropdownChanged = 'kStyledDropdownChanged';
|
|
|
|
class StyledDropdown<T> extends StatelessWidget {
|
|
const StyledDropdown(
|
|
{required List<DropdownMenuItem<T>> items,
|
|
required T value,
|
|
String? decoratorLabel,
|
|
Future<void> Function(T)? onChanged,
|
|
super.key})
|
|
: _items = items,
|
|
_onChanged = onChanged,
|
|
_decoratorLabel = decoratorLabel,
|
|
_value = value;
|
|
|
|
@override
|
|
Widget build(BuildContext context) {
|
|
final theme = Theme.of(context);
|
|
final scheme = theme.extension<ScaleScheme>()!;
|
|
|
|
Widget ctrl = DropdownButton<T>(
|
|
isExpanded: true,
|
|
padding: const EdgeInsets.fromLTRB(4, 0, 4, 0).scaled(context),
|
|
focusColor: theme.focusColor,
|
|
dropdownColor: scheme.primaryScale.elementBackground,
|
|
iconEnabledColor: scheme.primaryScale.appText,
|
|
iconDisabledColor: scheme.primaryScale.appText.withAlpha(127),
|
|
items: _items,
|
|
value: _value,
|
|
style: theme.textTheme.labelLarge,
|
|
onChanged: _onChanged == null
|
|
? null
|
|
: (value) {
|
|
if (value == null) {
|
|
return;
|
|
}
|
|
singleFuture((this, _kStyledDropdownChanged), () async {
|
|
await _onChanged(value);
|
|
});
|
|
});
|
|
if (_decoratorLabel != null) {
|
|
ctrl = ctrl
|
|
.paddingLTRB(0, 4.scaled(context), 0, 4.scaled(context))
|
|
.decoratorLabel(context, _decoratorLabel);
|
|
}
|
|
return ctrl;
|
|
}
|
|
|
|
final List<DropdownMenuItem<T>> _items;
|
|
final String? _decoratorLabel;
|
|
final Future<void> Function(T)? _onChanged;
|
|
final T _value;
|
|
}
|