Skip to content

Commit 12a4a33

Browse files
committed
feat(ui): add LanguageDropdownFormField widget
- Create a reusable dropdown form field for selecting a language - Add support for custom languages list, initial value, and label text - Implement localization using AppLocalizationsX
1 parent a1eac34 commit 12a4a33

File tree

1 file changed

+47
-0
lines changed

1 file changed

+47
-0
lines changed

language_dropdown_form_field.dart

Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,47 @@
1+
import 'package:core/core.dart';
2+
import 'package:flutter/material.dart';
3+
import 'package:flutter_news_app_web_dashboard_full_source_code/l10n/l10n.dart';
4+
5+
/// A reusable dropdown form field for selecting a language.
6+
class LanguageDropdownFormField extends StatelessWidget {
7+
/// {@macro language_dropdown_form_field}
8+
const LanguageDropdownFormField({
9+
required this.languages,
10+
required this.onChanged,
11+
this.initialValue,
12+
this.labelText,
13+
super.key,
14+
});
15+
16+
/// The list of languages to display in the dropdown.
17+
final List<Language> languages;
18+
19+
/// The currently selected language.
20+
final Language? initialValue;
21+
22+
/// The callback that is called when the user selects a language.
23+
final ValueChanged<Language?> onChanged;
24+
25+
/// The text to display as the label for the form field.
26+
final String? labelText;
27+
28+
@override
29+
Widget build(BuildContext context) {
30+
final l10n = AppLocalizationsX(context).l10n;
31+
32+
return DropdownButtonFormField<Language?>(
33+
value: initialValue,
34+
decoration: InputDecoration(
35+
labelText: labelText ?? l10n.language,
36+
border: const OutlineInputBorder(),
37+
),
38+
items: [
39+
DropdownMenuItem(value: null, child: Text(l10n.none)),
40+
...languages.map(
41+
(l) => DropdownMenuItem(value: l, child: Text(l.name)),
42+
),
43+
],
44+
onChanged: onChanged,
45+
);
46+
}
47+
}

0 commit comments

Comments
 (0)