11import '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