1
1
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' ;
3
4
4
5
/// A form field for selecting a language using the `language_picker` package.
5
6
///
6
7
/// This widget wraps the language picker functionality in a standard
7
8
/// [FormField] , making it easy to integrate into forms for validation
8
9
/// and state management. It presents as a read-only [TextFormField] that,
9
10
/// when tapped, opens a language selection dialog.
10
- class LanguagePickerFormField extends FormField <language_picker. Language > {
11
+ class LanguagePickerFormField extends FormField <Language > {
11
12
/// Creates a [LanguagePickerFormField] .
12
13
///
13
14
/// The [onSaved] , [validator] , [initialValue] , and [autovalidateMode] are
14
15
/// standard [FormField] properties.
15
16
///
16
17
/// The [labelText] is displayed as the input field's label.
18
+ /// The [onChanged] callback is invoked when a new language is selected.
17
19
LanguagePickerFormField ({
18
20
super .key,
19
21
super .onSaved,
20
22
super .validator,
21
23
super .initialValue,
22
24
super .autovalidateMode,
23
25
String ? labelText,
26
+ void Function (Language )? onChanged,
24
27
}) : super (
25
- builder: (FormFieldState <language_picker. Language > state) {
28
+ builder: (FormFieldState <Language > state) {
26
29
// This controller is just for displaying the text. The actual
27
30
// value is managed by the FormField's state.
28
31
final controller = TextEditingController (
29
32
text: state.value? .name,
30
33
);
31
34
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
+
32
60
return TextFormField (
33
61
controller: controller,
34
62
readOnly: true ,
@@ -38,19 +66,7 @@ class LanguagePickerFormField extends FormField<language_picker.Language> {
38
66
errorText: state.errorText,
39
67
suffixIcon: const Icon (Icons .arrow_drop_down),
40
68
),
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,
54
70
);
55
71
},
56
72
);
0 commit comments