mirror of
https://github.com/Iconica-Development/flutter_input_library.git
synced 2025-05-18 17:03:45 +02:00
Merge pull request #36 from Iconica-Development/feature/radio
feat: add radio button to the input library.
This commit is contained in:
commit
6b952ae230
8 changed files with 136 additions and 4 deletions
|
@ -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`.
|
||||||
|
|
|
@ -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)}'
|
||||||
: '',
|
: '',
|
||||||
);
|
);
|
||||||
|
|
|
@ -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';
|
||||||
|
|
|
@ -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,
|
||||||
),
|
),
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
|
@ -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),
|
||||||
|
|
72
lib/src/inputs/radio/radio_picker.dart
Normal file
72
lib/src/inputs/radio/radio_picker.dart
Normal 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;
|
||||||
|
}
|
48
lib/src/inputs/radio/radio_picker_field.dart
Normal file
48
lib/src/inputs/radio/radio_picker_field.dart
Normal 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);
|
||||||
|
}
|
||||||
|
},
|
||||||
|
),
|
||||||
|
],
|
||||||
|
),
|
||||||
|
],
|
||||||
|
],
|
||||||
|
);
|
||||||
|
}
|
|
@ -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:
|
||||||
|
|
Loading…
Reference in a new issue