Skip to content

Commit a5afe50

Browse files
committed
fix(shared): implement correct LanguagePickerFormField using showDialog
1 parent 2548e74 commit a5afe50

File tree

1 file changed

+32
-16
lines changed

1 file changed

+32
-16
lines changed

lib/shared/widgets/language_picker_form_field.dart

Lines changed: 32 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -1,34 +1,62 @@
11
import 'package:flutter/material.dart';
2-
import 'package:language_picker/language_picker.dart' as language_picker;
2+
import 'package:language_picker/language_picker.dart';
3+
import 'package:language_picker/languages.dart';
34

45
/// A form field for selecting a language using the `language_picker` package.
56
///
67
/// This widget wraps the language picker functionality in a standard
78
/// [FormField], making it easy to integrate into forms for validation
89
/// and state management. It presents as a read-only [TextFormField] that,
910
/// when tapped, opens a language selection dialog.
10-
class LanguagePickerFormField extends FormField<language_picker.Language> {
11+
class LanguagePickerFormField extends FormField<Language> {
1112
/// Creates a [LanguagePickerFormField].
1213
///
1314
/// The [onSaved], [validator], [initialValue], and [autovalidateMode] are
1415
/// standard [FormField] properties.
1516
///
1617
/// The [labelText] is displayed as the input field's label.
18+
/// The [onChanged] callback is invoked when a new language is selected.
1719
LanguagePickerFormField({
1820
super.key,
1921
super.onSaved,
2022
super.validator,
2123
super.initialValue,
2224
super.autovalidateMode,
2325
String? labelText,
26+
void Function(Language)? onChanged,
2427
}) : super(
25-
builder: (FormFieldState<language_picker.Language> state) {
28+
builder: (FormFieldState<Language> state) {
2629
// This controller is just for displaying the text. The actual
2730
// value is managed by the FormField's state.
2831
final controller = TextEditingController(
2932
text: state.value?.name,
3033
);
3134

35+
// Helper to build a simple list item for the dialog.
36+
Widget buildDialogItem(Language language) => Row(
37+
children: <Widget>[
38+
Text(language.name),
39+
const SizedBox(width: 8),
40+
Flexible(child: Text('(${language.isoCode})')),
41+
],
42+
);
43+
44+
void openLanguagePickerDialog() {
45+
showDialog<void>(
46+
context: state.context,
47+
builder: (context) => LanguagePickerDialog(
48+
isSearchable: true,
49+
title: const Text('Select your language'),
50+
onValuePicked: (Language language) {
51+
state.didChange(language);
52+
onChanged?.call(language);
53+
controller.text = language.name;
54+
},
55+
itemBuilder: buildDialogItem,
56+
),
57+
);
58+
}
59+
3260
return TextFormField(
3361
controller: controller,
3462
readOnly: true,
@@ -38,19 +66,7 @@ class LanguagePickerFormField extends FormField<language_picker.Language> {
3866
errorText: state.errorText,
3967
suffixIcon: const Icon(Icons.arrow_drop_down),
4068
),
41-
onTap: () {
42-
language_picker.showLanguagePicker(
43-
context: state.context,
44-
// Provide a default if no language is selected yet.
45-
selectedLanguage:
46-
state.value ?? language_picker.Languages.english,
47-
onValuePicked: (language_picker.Language language) {
48-
state.didChange(language);
49-
// Update the text in the read-only text field.
50-
controller.text = language.name;
51-
},
52-
);
53-
},
69+
onTap: openLanguagePickerDialog,
5470
);
5571
},
5672
);

0 commit comments

Comments
 (0)