Skip to content

Commit 84b229b

Browse files
committed
feat(shared): create language picker and export shared components
1 parent 71c334f commit 84b229b

File tree

3 files changed

+59
-0
lines changed

3 files changed

+59
-0
lines changed

lib/shared/utils/utils.dart

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1 +1,2 @@
11
export 'country_adapter.dart';
2+
export 'language_adapter.dart';
Lines changed: 57 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,57 @@
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+
}

lib/shared/widgets/widgets.dart

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1 +1,2 @@
11
export 'country_picker_form_field.dart';
2+
export 'language_picker_form_field.dart';

0 commit comments

Comments
 (0)