1
+ import 'package:flutter/material.dart' ;
2
+ import 'package:language_picker/language_picker.dart' ;
3
+ import 'package:language_picker/languages.dart' ;
4
+
5
+ /// A form field for selecting a language using the `language_picker` package.
6
+ ///
7
+ /// This widget wraps the language picker functionality in a standard
8
+ /// [FormField] , making it easy to integrate into forms for validation
9
+ /// and state management. It presents as a read-only [TextFormField] that,
10
+ /// when tapped, opens a language selection dialog.
11
+ class LanguagePickerFormField extends FormField <Language > {
12
+ /// Creates a [LanguagePickerFormField] .
13
+ ///
14
+ /// The [onSaved] , [validator] , [initialValue] , and [autovalidateMode] are
15
+ /// standard [FormField] properties.
16
+ ///
17
+ /// The [labelText] is displayed as the input field's label.
18
+ LanguagePickerFormField ({
19
+ super .key,
20
+ super .onSaved,
21
+ super .validator,
22
+ super .initialValue,
23
+ super .autovalidateMode,
24
+ String ? labelText,
25
+ }) : super (
26
+ builder: (FormFieldState <Language > state) {
27
+ // This controller is just for displaying the text. The actual
28
+ // value is managed by the FormField's state.
29
+ final controller = TextEditingController (
30
+ text: state.value? .name,
31
+ );
32
+
33
+ return TextFormField (
34
+ controller: controller,
35
+ readOnly: true ,
36
+ decoration: InputDecoration (
37
+ labelText: labelText ?? 'Language' ,
38
+ border: const OutlineInputBorder (),
39
+ errorText: state.errorText,
40
+ suffixIcon: const Icon (Icons .arrow_drop_down),
41
+ ),
42
+ onTap: () {
43
+ showLanguagePicker (
44
+ context: state.context,
45
+ // Provide a default if no language is selected yet.
46
+ selectedLanguage: state.value ?? Languages .english,
47
+ onValuePicked: (Language language) {
48
+ state.didChange (language);
49
+ // Update the text in the read-only text field.
50
+ controller.text = language.name;
51
+ },
52
+ );
53
+ },
54
+ );
55
+ },
56
+ );
57
+ }
0 commit comments