Compare commits

...

10 commits

Author SHA1 Message Date
Freek van de Ven
7d64f467bf chore: add component release workflow 2024-09-09 16:49:14 +02:00
mike doornenbal
de5d38ffc7
Merge pull request #43 from Iconica-Development/fix/radio-button-padding
feat: add option for spacing between radio items
2024-09-09 16:46:54 +02:00
Freek van de Ven
0da6ba35f2 feat: add option for spacing between radio items 2024-09-09 16:42:48 +02:00
Gorter-dev
5bee01e304
Merge pull request #42 from Iconica-Development/feature/styling
feat: add style to FlutterFormInputMultiLine
2024-08-07 11:00:33 +02:00
mike doornenbal
f2d1fb5262 fix: rename carouselController 2024-08-07 10:58:33 +02:00
mike doornenbal
815ca7b0b2 feat: flutter_iconica_analysis to 7.0.0 2024-08-07 10:38:33 +02:00
mike doornenbal
b6de3299e0 feat: add style to FlutterFormInputMultiLine 2024-08-07 10:28:18 +02:00
Gorter-dev
bc8b1d572b
Merge pull request #40 from Iconica-Development/fix/deploy
chore: ready the package for deployment to the pub server
2024-07-22 14:55:03 +02:00
Bart Ribbers
9838220de7 chore: ready the package for deployment to the pub server 2024-07-11 18:01:21 +02:00
Bart Ribbers
04752e9a53 chore: add fvm configuration to gitignore 2024-07-11 17:46:06 +02:00
38 changed files with 6278 additions and 6232 deletions

14
.github/workflows/release.yml vendored Normal file
View file

@ -0,0 +1,14 @@
name: Iconica Standard Component Release Workflow
# Workflow Caller version: 1.0.0
on:
release:
types: [published]
workflow_dispatch:
jobs:
call-global-iconica-workflow:
uses: Iconica-Development/.github/.github/workflows/component-release.yml@master
secrets: inherit
permissions: write-all

4
.gitignore vendored
View file

@ -35,3 +35,7 @@ example/windows
example/web example/web
example/android example/android
example/ios example/ios
# FVM Version Cache
.fvm/
.fvmrc

View file

@ -1,3 +1,12 @@
## 3.7.0
* Added a 16 pixel padding between the `FlutterFormInputRadioPicker` items that is customizable with the `itemSpacing` parameter.
## 3.6.0
* Added style parameter to `FlutterFormInputMultiLine`
* Upgrade flutter_iconica_analysis to 7.0.0
* Changed the name of the `CarouselController` to `FlutterInputCarouselController`
## 3.5.0 ## 3.5.0
* Added `selectableTimePredicate` to the `DateTimeInputField` constructor * Added `selectableTimePredicate` to the `DateTimeInputField` constructor

View file

View file

@ -45,10 +45,10 @@ packages:
dependency: "direct main" dependency: "direct main"
description: description:
name: cupertino_icons name: cupertino_icons
sha256: e35129dc44c9118cee2a5603506d823bab99c68393879edb440e0090d07586be sha256: ba631d1c7f7bef6b729a622b7b752645a2d076dba9976925b8f25725a30e1ee6
url: "https://pub.dev" url: "https://pub.dev"
source: hosted source: hosted
version: "1.0.5" version: "1.0.8"
fake_async: fake_async:
dependency: transitive dependency: transitive
description: description:
@ -68,15 +68,15 @@ packages:
path: ".." path: ".."
relative: true relative: true
source: path source: path
version: "3.3.0" version: "3.6.0"
flutter_lints: flutter_lints:
dependency: "direct dev" dependency: "direct dev"
description: description:
name: flutter_lints name: flutter_lints
sha256: aeb0b80a8b3709709c9cc496cdc027c5b3216796bc0af0ce1007eaf24464fd4c sha256: a25a15ebbdfc33ab1cd26c63a6ee519df92338a9c10f122adda92938253bef04
url: "https://pub.dev" url: "https://pub.dev"
source: hosted source: hosted
version: "2.0.1" version: "2.0.3"
flutter_test: flutter_test:
dependency: "direct dev" dependency: "direct dev"
description: flutter description: flutter
@ -118,10 +118,10 @@ packages:
dependency: transitive dependency: transitive
description: description:
name: lints name: lints
sha256: "5e4a9cd06d447758280a8ac2405101e0e2094d2a1dbdd3756aec3fe7775ba593" sha256: "0a217c6c989d21039f1498c3ed9f3ed71b354e69873f13a8dfc3c9fe76f1b452"
url: "https://pub.dev" url: "https://pub.dev"
source: hosted source: hosted
version: "2.0.1" version: "2.1.1"
matcher: matcher:
dependency: transitive dependency: transitive
description: description:

View file

@ -4,5 +4,5 @@
/// A library for creating input fields in Flutter. /// A library for creating input fields in Flutter.
library flutter_input_library; library flutter_input_library;
export 'src/inputs/inputs.dart'; export "src/inputs/inputs.dart";
export 'src/utils/utils.dart'; export "src/utils/utils.dart";

View file

@ -4,9 +4,9 @@
// ignore_for_file: avoid_positional_boolean_parameters // ignore_for_file: avoid_positional_boolean_parameters
import 'package:flutter/material.dart'; import "package:flutter/material.dart";
import 'package:flutter_input_library/src/inputs/bool/bool_field.dart'; import "package:flutter_input_library/src/inputs/bool/bool_field.dart";
class FlutterFormInputBool extends StatelessWidget { class FlutterFormInputBool extends StatelessWidget {
const FlutterFormInputBool({ const FlutterFormInputBool({

View file

@ -4,8 +4,8 @@
// ignore_for_file: avoid_positional_boolean_parameters // ignore_for_file: avoid_positional_boolean_parameters
import 'package:flutter/material.dart'; import "package:flutter/material.dart";
import 'package:flutter_input_library/flutter_input_library.dart'; import "package:flutter_input_library/flutter_input_library.dart";
class BoolFormField extends FormField<bool> { class BoolFormField extends FormField<bool> {
BoolFormField({ BoolFormField({

View file

@ -2,9 +2,9 @@
// //
// SPDX-License-Identifier: BSD-3-Clause // SPDX-License-Identifier: BSD-3-Clause
import 'package:flutter/material.dart'; import "package:flutter/material.dart";
import 'package:flutter_input_library/src/inputs/carousel/carousel_form.dart'; import "package:flutter_input_library/src/inputs/carousel/carousel_form.dart";
class FlutterFormInputCarousel extends StatelessWidget { class FlutterFormInputCarousel extends StatelessWidget {
const FlutterFormInputCarousel({ const FlutterFormInputCarousel({

View file

@ -2,15 +2,15 @@
// //
// SPDX-License-Identifier: BSD-3-Clause // SPDX-License-Identifier: BSD-3-Clause
import 'dart:async'; import "dart:async";
import 'package:flutter/material.dart'; import "package:flutter/material.dart";
import 'package:flutter_input_library/src/inputs/carousel/carousel_options.dart'; import "package:flutter_input_library/src/inputs/carousel/carousel_options.dart";
import 'package:flutter_input_library/src/inputs/carousel/carousel_state.dart'; import "package:flutter_input_library/src/inputs/carousel/carousel_state.dart";
import 'package:flutter_input_library/src/inputs/carousel/carousel_utils.dart'; import "package:flutter_input_library/src/inputs/carousel/carousel_utils.dart";
abstract class CarouselController { abstract class FlutterInputCarouselController {
factory CarouselController() => CarouselControllerImpl(); factory FlutterInputCarouselController() => CarouselControllerImpl();
bool get ready; bool get ready;
Future<void> get onReady; Future<void> get onReady;
@ -28,7 +28,7 @@ abstract class CarouselController {
void stopAutoPlay(); void stopAutoPlay();
} }
class CarouselControllerImpl implements CarouselController { class CarouselControllerImpl implements FlutterInputCarouselController {
final Completer<void> _readyCompleter = Completer<void>(); final Completer<void> _readyCompleter = Completer<void>();
CarouselState? _state; CarouselState? _state;

View file

@ -2,8 +2,8 @@
// //
// SPDX-License-Identifier: BSD-3-Clause // SPDX-License-Identifier: BSD-3-Clause
import 'package:flutter/material.dart'; import "package:flutter/material.dart";
import 'package:flutter_input_library/src/inputs/carousel/carousel_slider.dart'; import "package:flutter_input_library/src/inputs/carousel/carousel_slider.dart";
class CarouselFormField extends FormField<int> { class CarouselFormField extends FormField<int> {
CarouselFormField({ CarouselFormField({

View file

@ -2,7 +2,7 @@
// //
// SPDX-License-Identifier: BSD-3-Clause // SPDX-License-Identifier: BSD-3-Clause
import 'package:flutter/material.dart'; import "package:flutter/material.dart";
enum CarouselPageChangedReason { timed, manual, controller } enum CarouselPageChangedReason { timed, manual, controller }

View file

@ -4,17 +4,17 @@
/// ///
library carousel_slider; library carousel_slider;
import 'dart:async'; import "dart:async";
import 'package:flutter/gestures.dart'; import "package:flutter/gestures.dart";
import 'package:flutter/material.dart'; import "package:flutter/material.dart";
import 'package:flutter_input_library/src/inputs/carousel/carousel_controller.dart'; import "package:flutter_input_library/src/inputs/carousel/carousel_controller.dart";
import 'package:flutter_input_library/src/inputs/carousel/carousel_options.dart'; import "package:flutter_input_library/src/inputs/carousel/carousel_options.dart";
import 'package:flutter_input_library/src/inputs/carousel/carousel_state.dart'; import "package:flutter_input_library/src/inputs/carousel/carousel_state.dart";
import 'package:flutter_input_library/src/inputs/carousel/carousel_utils.dart'; import "package:flutter_input_library/src/inputs/carousel/carousel_utils.dart";
export 'carousel_controller.dart'; export "carousel_controller.dart";
export 'carousel_options.dart'; export "carousel_options.dart";
typedef ExtendedIndexedWidgetBuilder = Widget Function( typedef ExtendedIndexedWidgetBuilder = Widget Function(
BuildContext context, BuildContext context,
@ -26,25 +26,25 @@ class CarouselSlider extends StatefulWidget {
CarouselSlider({ CarouselSlider({
required this.items, required this.items,
required this.options, required this.options,
CarouselController? carouselController, FlutterInputCarouselController? carouselController,
super.key, super.key,
}) : itemBuilder = null, }) : itemBuilder = null,
itemCount = items != null ? items.length : 0, itemCount = items != null ? items.length : 0,
_carouselController = carouselController != null _carouselController = carouselController != null
? carouselController as CarouselControllerImpl ? carouselController as CarouselControllerImpl
: CarouselController() as CarouselControllerImpl; : FlutterInputCarouselController() as CarouselControllerImpl;
/// The on demand item builder constructor/ /// The on demand item builder constructor/
CarouselSlider.builder({ CarouselSlider.builder({
required this.itemCount, required this.itemCount,
required this.itemBuilder, required this.itemBuilder,
required this.options, required this.options,
CarouselController? carouselController, FlutterInputCarouselController? carouselController,
super.key, super.key,
}) : items = null, }) : items = null,
_carouselController = carouselController != null _carouselController = carouselController != null
? carouselController as CarouselControllerImpl ? carouselController as CarouselControllerImpl
: CarouselController() as CarouselControllerImpl; : FlutterInputCarouselController() as CarouselControllerImpl;
/// [CarouselOptions] to create a [CarouselState] with. /// [CarouselOptions] to create a [CarouselState] with.
final CarouselOptions options; final CarouselOptions options;
@ -81,6 +81,7 @@ class CarouselSliderState extends State<CarouselSlider>
/// [mode] is related to why the page is being changed. /// [mode] is related to why the page is being changed.
CarouselPageChangedReason mode = CarouselPageChangedReason.controller; CarouselPageChangedReason mode = CarouselPageChangedReason.controller;
// ignore: use_setters_to_change_properties
void changeMode(CarouselPageChangedReason mode) { void changeMode(CarouselPageChangedReason mode) {
this.mode = mode; this.mode = mode;
} }

View file

@ -2,8 +2,8 @@
// //
// SPDX-License-Identifier: BSD-3-Clause // SPDX-License-Identifier: BSD-3-Clause
import 'package:flutter/material.dart'; import "package:flutter/material.dart";
import 'package:flutter_input_library/src/inputs/carousel/carousel_slider.dart'; import "package:flutter_input_library/src/inputs/carousel/carousel_slider.dart";
class CarouselState { class CarouselState {
CarouselState( CarouselState(

View file

@ -2,9 +2,9 @@
// //
// SPDX-License-Identifier: BSD-3-Clause // SPDX-License-Identifier: BSD-3-Clause
import 'package:flutter/material.dart'; import "package:flutter/material.dart";
import 'package:flutter_input_library/src/inputs/date_picker/date_picker_field.dart'; import "package:flutter_input_library/src/inputs/date_picker/date_picker_field.dart";
import 'package:intl/intl.dart'; import "package:intl/intl.dart";
enum FlutterFormDateTimeType { enum FlutterFormDateTimeType {
date, date,

View file

@ -2,11 +2,11 @@
// //
// SPDX-License-Identifier: BSD-3-Clause // SPDX-License-Identifier: BSD-3-Clause
import 'dart:async'; import "dart:async";
import 'package:flutter/material.dart'; import "package:flutter/material.dart";
import 'package:flutter_input_library/src/inputs/date_picker/date_picker.dart'; import "package:flutter_input_library/src/inputs/date_picker/date_picker.dart";
import 'package:intl/intl.dart'; import "package:intl/intl.dart";
class DateTimeInputField extends StatefulWidget { class DateTimeInputField extends StatefulWidget {
const DateTimeInputField({ const DateTimeInputField({
@ -65,7 +65,7 @@ class _DateInputFieldState extends State<DateTimeInputField> {
late final DateTime initialDate; late final DateTime initialDate;
late final DateTimeRange initialDateRange; late final DateTimeRange initialDateRange;
late final TimeOfDay? initialTime; late final TimeOfDay? initialTime;
String currentValue = ''; String currentValue = "";
@override @override
void initState() { void initState() {
@ -97,9 +97,10 @@ class _DateInputFieldState extends State<DateTimeInputField> {
FlutterFormDateTimeType inputType, [ FlutterFormDateTimeType inputType, [
DateFormat? dateFormat, DateFormat? dateFormat,
]) async { ]) async {
var userInput = ''; var userInput = "";
switch (inputType) { switch (inputType) {
case FlutterFormDateTimeType.date: case FlutterFormDateTimeType.date:
if (context.mounted) {
var unformatted = await showDatePicker( var unformatted = await showDatePicker(
initialDate: initialDate, initialDate: initialDate,
context: context, context: context,
@ -110,19 +111,20 @@ class _DateInputFieldState extends State<DateTimeInputField> {
userInput = unformatted != null userInput = unformatted != null
? widget.dateFormat.format(unformatted) ? widget.dateFormat.format(unformatted)
: userInput; : userInput;
}
case FlutterFormDateTimeType.dateTime: case FlutterFormDateTimeType.dateTime:
await getInputFromUser(FlutterFormDateTimeType.date) await getInputFromUser(FlutterFormDateTimeType.date)
.then((value) async { .then((value) async {
if (value != '') { if (value != "") {
var secondInput = var secondInput =
await getInputFromUser(FlutterFormDateTimeType.time); await getInputFromUser(FlutterFormDateTimeType.time);
if (secondInput != '') { if (secondInput != "") {
var date = widget.dateFormat.parse(value); var date = widget.dateFormat.parse(value);
var time = dateFormat != null var time = dateFormat != null
? dateFormat.parse('01 01 1970 $secondInput') ? dateFormat.parse("01 01 1970 $secondInput")
: DateFormat('dd MM yyyy HH:mm') : DateFormat("dd MM yyyy HH:mm")
.parse('01 01 1970 $secondInput'); .parse("01 01 1970 $secondInput");
userInput = widget.dateFormat.format( userInput = widget.dateFormat.format(
DateTime( DateTime(
date.year, date.year,
@ -145,13 +147,14 @@ 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)}"
: '', : "",
); );
} }
case FlutterFormDateTimeType.time: case FlutterFormDateTimeType.time:
var locale = MaterialLocalizations.of(context);
if (context.mounted) { if (context.mounted) {
userInput = await showTimePicker( userInput = await showTimePicker(
initialEntryMode: widget.timePickerEntryMode, initialEntryMode: widget.timePickerEntryMode,
@ -164,9 +167,8 @@ class _DateInputFieldState extends State<DateTimeInputField> {
initialTime: initialTimeOfDay, initialTime: initialTimeOfDay,
).then( ).then(
(value) => value == null (value) => value == null
? '' ? ""
: MaterialLocalizations.of(context) : locale.formatTimeOfDay(value, alwaysUse24HourFormat: true),
.formatTimeOfDay(value, alwaysUse24HourFormat: true),
); );
} }
} }
@ -185,12 +187,12 @@ class _DateInputFieldState extends State<DateTimeInputField> {
? () async { ? () async {
var userInput = await getInputFromUser( var userInput = await getInputFromUser(
widget.inputType, widget.inputType,
DateFormat('dd MM yyyy HH:mm'), DateFormat("dd MM yyyy HH:mm"),
); );
setState(() { setState(() {
currentValue = userInput != '' ? userInput : currentValue; currentValue = userInput != "" ? userInput : currentValue;
widget.onChanged widget.onChanged
?.call(userInput != '' ? userInput : currentValue); ?.call(userInput != "" ? userInput : currentValue);
}); });
} }
: null, : null,
@ -199,7 +201,7 @@ class _DateInputFieldState extends State<DateTimeInputField> {
InputDecoration( InputDecoration(
suffixIcon: widget.showIcon ? Icon(widget.icon) : null, suffixIcon: widget.showIcon ? Icon(widget.icon) : null,
focusColor: Theme.of(context).primaryColor, focusColor: Theme.of(context).primaryColor,
label: widget.label ?? const Text('Date'), label: widget.label ?? const Text("Date"),
), ),
enabled: widget.enabled, enabled: widget.enabled,
); );

View file

@ -1,4 +1,4 @@
import 'package:flutter/material.dart'; import "package:flutter/material.dart";
class FlutterFormInputDropdown extends StatelessWidget { class FlutterFormInputDropdown extends StatelessWidget {
const FlutterFormInputDropdown({ const FlutterFormInputDropdown({

View file

@ -1,13 +1,13 @@
export 'bool/bool.dart'; export "bool/bool.dart";
export 'carousel/carousel.dart'; export "carousel/carousel.dart";
export 'date_picker/date_picker.dart'; export "date_picker/date_picker.dart";
export 'dropdown/dropdown.dart'; export "dropdown/dropdown.dart";
export 'number_picker/number_picker.dart'; 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 "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";
export 'text/plain_text.dart'; export "text/plain_text.dart";

View file

@ -2,11 +2,11 @@
// //
// SPDX-License-Identifier: BSD-3-Clause // SPDX-License-Identifier: BSD-3-Clause
import 'dart:math' as math; import "dart:math" as math;
import 'package:flutter/material.dart'; import "package:flutter/material.dart";
import 'package:flutter_input_library/src/inputs/number_picker/number_picker_field.dart'; import "package:flutter_input_library/src/inputs/number_picker/number_picker_field.dart";
class DecimalNumberPicker extends StatelessWidget { class DecimalNumberPicker extends StatelessWidget {
const DecimalNumberPicker({ const DecimalNumberPicker({
@ -28,8 +28,8 @@ class DecimalNumberPicker extends StatelessWidget {
this.integerZeroPad = false, this.integerZeroPad = false,
this.integerDecoration, this.integerDecoration,
this.decimalDecoration, this.decimalDecoration,
}) : assert(minValue <= value, 'value must be greater than minValue'), }) : assert(minValue <= value, "value must be greater than minValue"),
assert(value <= maxValue, 'value must be less than maxValue'); assert(value <= maxValue, "value must be less than maxValue");
final int minValue; final int minValue;
final int maxValue; final int maxValue;
final double value; final double value;

View file

@ -2,12 +2,12 @@
// //
// SPDX-License-Identifier: BSD-3-Clause // SPDX-License-Identifier: BSD-3-Clause
import 'dart:math' as math; import "dart:math" as math;
import 'package:flutter/gestures.dart' show DragStartBehavior; import "package:flutter/gestures.dart" show DragStartBehavior;
import 'package:flutter/material.dart'; import "package:flutter/material.dart";
import 'package:flutter/rendering.dart'; import "package:flutter/rendering.dart";
import 'package:flutter/widgets.dart'; import "package:flutter/widgets.dart";
/// Infinite ListView /// Infinite ListView
/// ///
@ -274,18 +274,18 @@ class InfiniteListViewState extends State<InfiniteListView> {
void debugFillProperties(DiagnosticPropertiesBuilder properties) { void debugFillProperties(DiagnosticPropertiesBuilder properties) {
super.debugFillProperties(properties); super.debugFillProperties(properties);
properties properties
.add(EnumProperty<Axis>('scrollDirection', widget.scrollDirection)); .add(EnumProperty<Axis>("scrollDirection", widget.scrollDirection));
properties.add( properties.add(
FlagProperty( FlagProperty(
'reverse', "reverse",
value: widget.reverse, value: widget.reverse,
ifTrue: 'reversed', ifTrue: "reversed",
showName: true, showName: true,
), ),
); );
properties.add( properties.add(
DiagnosticsProperty<ScrollController>( DiagnosticsProperty<ScrollController>(
'controller', "controller",
widget.controller, widget.controller,
showName: false, showName: false,
defaultValue: null, defaultValue: null,
@ -293,7 +293,7 @@ class InfiniteListViewState extends State<InfiniteListView> {
); );
properties.add( properties.add(
DiagnosticsProperty<ScrollPhysics>( DiagnosticsProperty<ScrollPhysics>(
'physics', "physics",
widget.physics, widget.physics,
showName: false, showName: false,
defaultValue: null, defaultValue: null,
@ -301,16 +301,16 @@ class InfiniteListViewState extends State<InfiniteListView> {
); );
properties.add( properties.add(
DiagnosticsProperty<EdgeInsetsGeometry>( DiagnosticsProperty<EdgeInsetsGeometry>(
'padding', "padding",
widget.padding, widget.padding,
defaultValue: null, defaultValue: null,
), ),
); );
properties.add( properties.add(
DoubleProperty('itemExtent', widget.itemExtent, defaultValue: null), DoubleProperty("itemExtent", widget.itemExtent, defaultValue: null),
); );
properties.add( properties.add(
DoubleProperty('cacheExtent', widget.cacheExtent, defaultValue: null), DoubleProperty("cacheExtent", widget.cacheExtent, defaultValue: null),
); );
} }
} }

View file

@ -2,9 +2,9 @@
// //
// SPDX-License-Identifier: BSD-3-Clause // SPDX-License-Identifier: BSD-3-Clause
import 'package:flutter/material.dart'; import "package:flutter/material.dart";
import 'package:flutter_input_library/src/inputs/number_picker/number_picker_field.dart'; import "package:flutter_input_library/src/inputs/number_picker/number_picker_field.dart";
class FlutterFormInputNumberPicker extends StatelessWidget { class FlutterFormInputNumberPicker extends StatelessWidget {
const FlutterFormInputNumberPicker({ const FlutterFormInputNumberPicker({
@ -16,7 +16,7 @@ class FlutterFormInputNumberPicker extends StatelessWidget {
this.initialValue, this.initialValue,
this.validator, this.validator,
this.axis = Axis.vertical, 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;
final int maxValue; final int maxValue;

View file

@ -2,11 +2,11 @@
// //
// SPDX-License-Identifier: BSD-3-Clause // SPDX-License-Identifier: BSD-3-Clause
import 'dart:async'; import "dart:async";
import 'package:flutter/material.dart'; import "package:flutter/material.dart";
import 'package:flutter/services.dart'; import "package:flutter/services.dart";
import 'package:flutter_input_library/src/inputs/number_picker/infinite_listview.dart'; import "package:flutter_input_library/src/inputs/number_picker/infinite_listview.dart";
typedef TextMapper = String Function(String numberText); typedef TextMapper = String Function(String numberText);
@ -29,8 +29,8 @@ class NumberPicker extends StatefulWidget {
this.zeroPad = false, this.zeroPad = false,
this.textMapper, this.textMapper,
this.infiniteLoop = false, this.infiniteLoop = false,
}) : assert(minValue <= value, 'value must be greater than minValue'), }) : assert(minValue <= value, "value must be greater than minValue"),
assert(value <= maxValue, 'value must be less than maxValue'); assert(value <= maxValue, "value must be less than maxValue");
/// Min value user can pick /// Min value user can pick
final int minValue; final int minValue;
@ -248,7 +248,7 @@ class NumberPickerState extends State<NumberPicker> {
String _getDisplayedValue(int value) { String _getDisplayedValue(int value) {
var text = widget.zeroPad var text = widget.zeroPad
? value.toString().padLeft(widget.maxValue.toString().length, '0') ? value.toString().padLeft(widget.maxValue.toString().length, "0")
: value.toString(); : value.toString();
if (widget.textMapper != null) { if (widget.textMapper != null) {
return widget.textMapper!(text); return widget.textMapper!(text);

File diff suppressed because it is too large Load diff

View file

@ -3,9 +3,9 @@
// SPDX-License-Identifier: BSD-3-Clause // SPDX-License-Identifier: BSD-3-Clause
// ignore: depend_on_referenced_packages // ignore: depend_on_referenced_packages
import 'package:collection/collection.dart'; import "package:collection/collection.dart";
import 'package:flutter/material.dart'; import "package:flutter/material.dart";
import 'package:flutter_input_library/flutter_input_library.dart'; import "package:flutter_input_library/flutter_input_library.dart";
class FlutterFormInputPhone extends StatefulWidget { class FlutterFormInputPhone extends StatefulWidget {
const FlutterFormInputPhone({ const FlutterFormInputPhone({
@ -20,7 +20,7 @@ class FlutterFormInputPhone extends StatefulWidget {
this.numberFieldStyle, this.numberFieldStyle,
this.dialCodeSelectorStyle, this.dialCodeSelectorStyle,
this.enabled = true, this.enabled = true,
this.priorityCountries = const ['NL', 'BE', 'LU'], this.priorityCountries = const ["NL", "BE", "LU"],
this.textAlignVertical = TextAlignVertical.top, this.textAlignVertical = TextAlignVertical.top,
this.dialCodeSelectorPadding = const EdgeInsets.only(top: 6), this.dialCodeSelectorPadding = const EdgeInsets.only(top: 6),
}); });
@ -82,7 +82,7 @@ class _FlutterFormInputPhoneState extends State<FlutterFormInputPhone> {
Widget build(BuildContext context) { Widget build(BuildContext context) {
var inputDecoration = widget.decoration ?? var inputDecoration = widget.decoration ??
InputDecoration( InputDecoration(
label: widget.label ?? const Text('Phone number'), label: widget.label ?? const Text("Phone number"),
); );
return FlutterFormInputPlainText( return FlutterFormInputPlainText(
@ -122,7 +122,7 @@ class _FlutterFormInputPhoneState extends State<FlutterFormInputPhone> {
const SizedBox( const SizedBox(
width: 4, width: 4,
), ),
Text('+${country.dialCode}'), Text("+${country.dialCode}"),
], ],
), ),
), ),

View file

@ -3,9 +3,9 @@
// SPDX-License-Identifier: BSD-3-Clause // SPDX-License-Identifier: BSD-3-Clause
// ignore: depend_on_referenced_packages // ignore: depend_on_referenced_packages
import 'package:collection/collection.dart'; import "package:collection/collection.dart";
import 'package:flutter/material.dart'; import "package:flutter/material.dart";
import 'package:flutter_input_library/src/inputs/radio/radio_picker_field.dart'; import "package:flutter_input_library/src/inputs/radio/radio_picker_field.dart";
class FlutterFormInputRadioPicker extends StatelessWidget { class FlutterFormInputRadioPicker extends StatelessWidget {
const FlutterFormInputRadioPicker({ const FlutterFormInputRadioPicker({
@ -14,18 +14,21 @@ class FlutterFormInputRadioPicker extends StatelessWidget {
this.onSaved, this.onSaved,
this.onChanged, this.onChanged,
this.initialValue, this.initialValue,
this.itemSpacing = 16.0,
}); });
final Function(RadioItem?)? onSaved; final Function(RadioItem?)? onSaved;
final String? initialValue; final String? initialValue;
final Function(RadioItem?)? onChanged; final Function(RadioItem?)? onChanged;
final List<RadioItem> items; final List<RadioItem> items;
final double itemSpacing;
@override @override
Widget build(BuildContext context) => RadioPickerFormField( Widget build(BuildContext context) => RadioPickerFormField(
onSaved: (value) => onSaved?.call(value), onSaved: (value) => onSaved?.call(value),
onChanged: (value) => onChanged?.call(value), onChanged: (value) => onChanged?.call(value),
initialValue: items.firstWhereOrNull((i) => i.value == initialValue), initialValue: items.firstWhereOrNull((i) => i.value == initialValue),
itemSpacing: itemSpacing,
items: items, items: items,
); );
} }
@ -34,6 +37,7 @@ class RadioPickerFormField extends FormField<RadioItem?> {
RadioPickerFormField({ RadioPickerFormField({
required FormFieldSetter<RadioItem> super.onSaved, required FormFieldSetter<RadioItem> super.onSaved,
required List<RadioItem> items, required List<RadioItem> items,
required double itemSpacing,
void Function(RadioItem value)? onChanged, void Function(RadioItem value)? onChanged,
super.initialValue, super.initialValue,
super.key, super.key,
@ -46,6 +50,7 @@ class RadioPickerFormField extends FormField<RadioItem?> {
}, },
items: items, items: items,
initialValue: initialValue, initialValue: initialValue,
itemSpacing: itemSpacing,
), ),
); );
} }

View file

@ -1,10 +1,11 @@
import 'package:flutter/material.dart'; import "package:flutter/material.dart";
import 'package:flutter_input_library/src/inputs/radio/radio_picker.dart'; import "package:flutter_input_library/src/inputs/radio/radio_picker.dart";
class RadioPicker extends StatefulWidget { class RadioPicker extends StatefulWidget {
const RadioPicker({ const RadioPicker({
required this.onChanged, required this.onChanged,
required this.items, required this.items,
this.itemSpacing = 16.0,
this.initialValue, this.initialValue,
super.key, super.key,
}); });
@ -13,12 +14,15 @@ class RadioPicker extends StatefulWidget {
final Function(RadioItem) onChanged; final Function(RadioItem) onChanged;
final List<RadioItem> items; final List<RadioItem> items;
/// The spacing between each item.
final double itemSpacing;
@override @override
State<RadioPicker> createState() => _RadioPickerState(); State<RadioPicker> createState() => _RadioPickerState();
} }
class _RadioPickerState extends State<RadioPicker> { class _RadioPickerState extends State<RadioPicker> {
late var value = widget.initialValue; late RadioItem? value = widget.initialValue;
@override @override
Widget build(BuildContext context) => Wrap( Widget build(BuildContext context) => Wrap(
@ -42,6 +46,9 @@ class _RadioPickerState extends State<RadioPicker> {
), ),
], ],
), ),
if (widget.items.last != item) ...[
SizedBox(width: widget.itemSpacing),
],
], ],
], ],
); );

View file

@ -1,3 +1,3 @@
export 'scroll_picker_decoration.dart'; export "scroll_picker_decoration.dart";
export 'scroll_picker_type_extensions.dart'; export "scroll_picker_type_extensions.dart";
export 'scroll_picker_widget.dart'; export "scroll_picker_widget.dart";

View file

@ -2,7 +2,7 @@
// //
// SPDX-License-Identifier: BSD-3-Clause // SPDX-License-Identifier: BSD-3-Clause
import 'package:flutter/material.dart'; import "package:flutter/material.dart";
class ScrollPickerDecoration { class ScrollPickerDecoration {
const ScrollPickerDecoration({ const ScrollPickerDecoration({

View file

@ -2,8 +2,8 @@
// //
// SPDX-License-Identifier: BSD-3-Clause // SPDX-License-Identifier: BSD-3-Clause
import 'package:flutter/material.dart'; import "package:flutter/material.dart";
import 'package:flutter_input_library/src/inputs/scroll_picker/scroll_picker_decoration.dart'; import "package:flutter_input_library/src/inputs/scroll_picker/scroll_picker_decoration.dart";
class ScrollPicker extends StatefulWidget { class ScrollPicker extends StatefulWidget {
const ScrollPicker({ const ScrollPicker({

View file

@ -35,7 +35,7 @@ class TypeUtils {
WeekDay end, WeekDay end,
) { ) {
if (start.index > end.index) { if (start.index > end.index) {
throw ArgumentError('Start month must be before or equal to end month.'); throw ArgumentError("Start month must be before or equal to end month.");
} }
var result = <DateTime>[]; var result = <DateTime>[];
@ -49,7 +49,7 @@ class TypeUtils {
/// Creates list of Datetime with the months from start to end. /// Creates list of Datetime with the months from start to end.
List<DateTime> createMonthList(Month start, Month end, {int? year}) { List<DateTime> createMonthList(Month start, Month end, {int? year}) {
if (start.index > end.index) { if (start.index > end.index) {
throw ArgumentError('Start month must be before or equal to end month.'); throw ArgumentError("Start month must be before or equal to end month.");
} }
var result = <DateTime>[]; var result = <DateTime>[];
@ -65,7 +65,7 @@ class TypeUtils {
/// Creates a list of Datetime with the years from start to end. /// Creates a list of Datetime with the years from start to end.
List<DateTime> createYearList(int start, int end) { List<DateTime> createYearList(int start, int end) {
if (start > end) { if (start > end) {
throw ArgumentError('Start year must be before or equal to year month.'); throw ArgumentError("Start year must be before or equal to year month.");
} }
var result = <DateTime>[]; var result = <DateTime>[];

View file

@ -2,9 +2,9 @@
// //
// SPDX-License-Identifier: BSD-3-Clause // SPDX-License-Identifier: BSD-3-Clause
import 'package:flutter/material.dart'; import "package:flutter/material.dart";
import 'package:flutter_input_library/src/inputs/scroll_picker/scroll_picker_decoration.dart'; import "package:flutter_input_library/src/inputs/scroll_picker/scroll_picker_decoration.dart";
import 'package:flutter_input_library/src/inputs/scroll_picker/scroll_picker_field.dart'; import "package:flutter_input_library/src/inputs/scroll_picker/scroll_picker_field.dart";
class FlutterFormInputScrollPicker<T> extends StatelessWidget { class FlutterFormInputScrollPicker<T> extends StatelessWidget {
const FlutterFormInputScrollPicker({ const FlutterFormInputScrollPicker({

View file

@ -2,8 +2,8 @@
// //
// SPDX-License-Identifier: BSD-3-Clause // SPDX-License-Identifier: BSD-3-Clause
import 'package:flutter/material.dart'; import "package:flutter/material.dart";
import 'package:flutter_input_library/src/inputs/slider/slider_field.dart'; import "package:flutter_input_library/src/inputs/slider/slider_field.dart";
class FlutterFormInputSlider extends StatelessWidget { class FlutterFormInputSlider extends StatelessWidget {
const FlutterFormInputSlider({ const FlutterFormInputSlider({
@ -15,7 +15,7 @@ class FlutterFormInputSlider extends StatelessWidget {
this.initialValue, this.initialValue,
this.validator, this.validator,
this.focusNode, this.focusNode,
}) : assert(minValue < maxValue, 'minValue must be less than maxValue'); }) : assert(minValue < maxValue, "minValue must be less than maxValue");
final int minValue; final int minValue;
final int maxValue; final int maxValue;

View file

@ -2,7 +2,7 @@
// //
// SPDX-License-Identifier: BSD-3-Clause // SPDX-License-Identifier: BSD-3-Clause
import 'package:flutter/material.dart'; import "package:flutter/material.dart";
/// Creates a slider with the given input parameters /// Creates a slider with the given input parameters
class SliderFormField extends FormField<double> { class SliderFormField extends FormField<double> {

View file

@ -2,8 +2,8 @@
// //
// SPDX-License-Identifier: BSD-3-Clause // SPDX-License-Identifier: BSD-3-Clause
import 'package:flutter/material.dart'; import "package:flutter/material.dart";
import 'package:flutter/services.dart'; import "package:flutter/services.dart";
/// Generates a [TextFormField] for passwords. It requires a /// Generates a [TextFormField] for passwords. It requires a
/// [FlutterFormInputController] as the [controller] parameter and an /// [FlutterFormInputController] as the [controller] parameter and an

View file

@ -2,8 +2,8 @@
// //
// SPDX-License-Identifier: BSD-3-Clause // SPDX-License-Identifier: BSD-3-Clause
import 'package:flutter/material.dart'; import "package:flutter/material.dart";
import 'package:flutter/services.dart'; import "package:flutter/services.dart";
class FlutterFormInputPlainText extends StatelessWidget { class FlutterFormInputPlainText extends StatelessWidget {
const FlutterFormInputPlainText({ const FlutterFormInputPlainText({
@ -53,7 +53,7 @@ class FlutterFormInputPlainText extends StatelessWidget {
Widget build(BuildContext context) { Widget build(BuildContext context) {
var inputDecoration = decoration ?? var inputDecoration = decoration ??
InputDecoration( InputDecoration(
label: label ?? const Text('Plain text'), label: label ?? const Text("Plain text"),
); );
return TextFormField( return TextFormField(
@ -96,6 +96,7 @@ class FlutterFormInputMultiLine extends StatelessWidget {
this.validator, this.validator,
this.onFieldSubmitted, this.onFieldSubmitted,
this.textCapitalization = TextCapitalization.sentences, this.textCapitalization = TextCapitalization.sentences,
this.style,
}); });
final Widget? label; final Widget? label;
@ -113,12 +114,14 @@ class FlutterFormInputMultiLine extends StatelessWidget {
final Function(String?)? onChanged; final Function(String?)? onChanged;
final Function(String?)? onFieldSubmitted; final Function(String?)? onFieldSubmitted;
final TextCapitalization textCapitalization; final TextCapitalization textCapitalization;
final TextStyle? style;
@override @override
Widget build(BuildContext context) => Column( Widget build(BuildContext context) => Column(
children: [ children: [
Expanded( Expanded(
child: FlutterFormInputPlainText( child: FlutterFormInputPlainText(
style: style,
label: label, label: label,
textAlignVertical: TextAlignVertical.top, textAlignVertical: TextAlignVertical.top,
expands: true, expands: true,

View file

@ -2,4 +2,4 @@
// //
// SPDX-License-Identifier: BSD-3-Clause // SPDX-License-Identifier: BSD-3-Clause
export 'validators/validators.dart'; export "validators/validators.dart";

View file

@ -2,4 +2,4 @@
// //
// SPDX-License-Identifier: BSD-3-Clause // SPDX-License-Identifier: BSD-3-Clause
export 'email/email.dart'; export "email/email.dart";

View file

@ -1,13 +1,16 @@
name: flutter_input_library name: flutter_input_library
description: A new Flutter package project. description: A new Flutter package project.
version: 3.5.0 version: 3.7.0
repository: https://github.com/Iconica-Development/flutter_input_library repository: https://github.com/Iconica-Development/flutter_input_library
publish_to: https://forgejo.internal.iconica.nl/api/packages/internal/pub
environment: environment:
sdk: ^3.0.0 sdk: ">=3.0.0 <4.0.0"
flutter: ">=1.17.0" flutter: ">=1.17.0"
dependencies: dependencies:
collection: ^1.18.0
flutter: flutter:
sdk: flutter sdk: flutter
intl: ">=0.18.0 <1.0.0" intl: ">=0.18.0 <1.0.0"
@ -18,6 +21,4 @@ dev_dependencies:
flutter_iconica_analysis: flutter_iconica_analysis:
git: git:
url: https://github.com/Iconica-Development/flutter_iconica_analysis url: https://github.com/Iconica-Development/flutter_iconica_analysis
ref: 6.0.0 ref: 7.0.0
flutter: