Merge pull request #36 from Iconica-Development/feature/radio

feat: add radio button to the input library.
This commit is contained in:
Gorter-dev 2024-04-25 09:16:49 +02:00 committed by GitHub
commit 6b952ae230
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
8 changed files with 136 additions and 4 deletions

View file

@ -76,3 +76,8 @@
## 3.2.1 ## 3.2.1
* Added `PhoneNumber` model to save the `FlutterFormInputPhone` result. * Added `PhoneNumber` model to save the `FlutterFormInputPhone` result.
* Added more customization for `FlutterFormInputPhone`. * Added more customization for `FlutterFormInputPhone`.
## 3.3.0
* Added `FlutterFormInputRadioPicker`
* Changed the `FlutterFormInputNumberPicker` and added axis parameter.
* Changed the formating of the result value of the `showDateRangePicker`.

View file

@ -142,7 +142,7 @@ class _DateInputFieldState extends State<DateTimeInputField> {
initialDateRange: initialDateRange, initialDateRange: initialDateRange,
).then( ).then(
(value) => value != null (value) => value != null
? '${widget.dateFormat.format(value.start)} -' ? '${widget.dateFormat.format(value.start)} - '
'${widget.dateFormat.format(value.end)}' '${widget.dateFormat.format(value.end)}'
: '', : '',
); );

View file

@ -5,6 +5,7 @@ export 'number_picker/number_picker.dart';
export 'phone/countries.dart'; export 'phone/countries.dart';
export 'phone/phone.dart'; export 'phone/phone.dart';
export 'phone/phone_number_model.dart'; export 'phone/phone_number_model.dart';
export 'radio/radio_picker.dart';
export 'scroll_picker/scroll_picker.dart'; export 'scroll_picker/scroll_picker.dart';
export 'slider/slider.dart'; export 'slider/slider.dart';
export 'text/password.dart'; export 'text/password.dart';

View file

@ -15,6 +15,7 @@ class FlutterFormInputNumberPicker extends StatelessWidget {
this.onChanged, this.onChanged,
this.initialValue, this.initialValue,
this.validator, this.validator,
this.axis = Axis.vertical,
}) : assert(minValue < maxValue, 'minValue must be less than maxValue'); }) : assert(minValue < maxValue, 'minValue must be less than maxValue');
final int minValue; final int minValue;
@ -23,6 +24,7 @@ class FlutterFormInputNumberPicker extends StatelessWidget {
final String? Function(int?)? validator; final String? Function(int?)? validator;
final int? initialValue; final int? initialValue;
final Function(int?)? onChanged; final Function(int?)? onChanged;
final Axis axis;
@override @override
Widget build(BuildContext context) => NumberPickerFormField( Widget build(BuildContext context) => NumberPickerFormField(
@ -32,6 +34,7 @@ class FlutterFormInputNumberPicker extends StatelessWidget {
validator: (value) => validator?.call(value), validator: (value) => validator?.call(value),
onChanged: (value) => onChanged?.call(value), onChanged: (value) => onChanged?.call(value),
initialValue: initialValue ?? 0, initialValue: initialValue ?? 0,
axis: axis,
); );
} }
@ -44,6 +47,7 @@ class NumberPickerFormField extends FormField<int> {
int super.initialValue = 0, int super.initialValue = 0,
int minValue = 0, int minValue = 0,
int maxValue = 100, int maxValue = 100,
Axis axis = Axis.vertical,
}) : super( }) : super(
builder: (FormFieldState<int> state) => NumberPicker( builder: (FormFieldState<int> state) => NumberPicker(
minValue: minValue, minValue: minValue,
@ -55,7 +59,9 @@ class NumberPickerFormField extends FormField<int> {
state.didChange(value); state.didChange(value);
}, },
itemHeight: 35, itemHeight: 35,
itemWidth: 35,
itemCount: 5, itemCount: 5,
axis: axis,
), ),
); );
} }

View file

@ -182,8 +182,8 @@ class NumberPickerState extends State<NumberPicker> {
children: [ children: [
Center( Center(
child: Container( child: Container(
width: 300, width: widget.itemWidth,
height: 45, height: widget.itemHeight,
decoration: BoxDecoration( decoration: BoxDecoration(
borderRadius: BorderRadius.circular(5), borderRadius: BorderRadius.circular(5),
color: const Color(0xFFD8D8D8).withOpacity(0.50), color: const Color(0xFFD8D8D8).withOpacity(0.50),

View file

@ -0,0 +1,72 @@
// SPDX-FileCopyrightText: 2024 Iconica
//
// SPDX-License-Identifier: BSD-3-Clause
// ignore: depend_on_referenced_packages
import 'package:collection/collection.dart';
import 'package:flutter/material.dart';
import 'package:flutter_input_library/src/inputs/radio/radio_picker_field.dart';
class FlutterFormInputRadioPicker extends StatelessWidget {
const FlutterFormInputRadioPicker({
required this.items,
super.key,
this.onSaved,
this.onChanged,
this.initialValue,
});
final Function(RadioItem?)? onSaved;
final String? initialValue;
final Function(RadioItem?)? onChanged;
final List<RadioItem> items;
@override
Widget build(BuildContext context) => RadioPickerFormField(
onSaved: (value) => onSaved?.call(value),
onChanged: (value) => onChanged?.call(value),
initialValue: items.firstWhereOrNull((i) => i.value == initialValue),
items: items,
);
}
class RadioPickerFormField extends FormField<RadioItem?> {
RadioPickerFormField({
required FormFieldSetter<RadioItem> super.onSaved,
required List<RadioItem> items,
void Function(RadioItem value)? onChanged,
super.initialValue,
super.key,
}) : super(
builder: (FormFieldState<RadioItem?> state) => RadioPicker(
onChanged: (value) {
onChanged?.call(value);
state.didChange(value);
},
items: items,
initialValue: initialValue,
),
);
}
class RadioItem<T> {
/// Creates an item for a radio menu.
///
/// The [child] argument is required.
const RadioItem({
required this.child,
required this.value,
this.onTap,
});
/// Called when the dropdown menu item is tapped.
final VoidCallback? onTap;
/// The value to return if the user selects this menu item.
///
/// Eventually returned in a call to [DropdownButton.onChanged].
final T value;
final Widget child;
}

View file

@ -0,0 +1,48 @@
import 'package:flutter/material.dart';
import 'package:flutter_input_library/src/inputs/radio/radio_picker.dart';
class RadioPicker extends StatefulWidget {
const RadioPicker({
required this.onChanged,
required this.items,
this.initialValue,
super.key,
});
final RadioItem? initialValue;
final Function(RadioItem) onChanged;
final List<RadioItem> items;
@override
State<RadioPicker> createState() => _RadioPickerState();
}
class _RadioPickerState extends State<RadioPicker> {
late var value = widget.initialValue;
@override
Widget build(BuildContext context) => Wrap(
children: [
for (var item in widget.items) ...[
Row(
mainAxisSize: MainAxisSize.min,
children: [
item.child,
Radio<RadioItem>(
value: item,
groupValue: value,
onChanged: (v) {
if (v != null) {
setState(() {
value = v;
});
widget.onChanged(v);
}
},
),
],
),
],
],
);
}

View file

@ -1,6 +1,6 @@
name: flutter_input_library name: flutter_input_library
description: A new Flutter package project. description: A new Flutter package project.
version: 3.2.1 version: 3.3.0
repository: https://github.com/Iconica-Development/flutter_input_library repository: https://github.com/Iconica-Development/flutter_input_library
environment: environment: