mirror of
https://github.com/Iconica-Development/flutter_input_library.git
synced 2025-05-18 17:03:45 +02:00
feat: Add checkbox as option to the flutter input switch which is now called FlutterFormInputBool
This commit is contained in:
parent
8eb1d80a9f
commit
8d1ad0ca02
8 changed files with 166 additions and 90 deletions
|
@ -59,4 +59,7 @@
|
||||||
* Addition of 'obscureText' parameter to 'FlutterFormInputPlainText'
|
* Addition of 'obscureText' parameter to 'FlutterFormInputPlainText'
|
||||||
|
|
||||||
## 2.7.0
|
## 2.7.0
|
||||||
* Addition of 'decoration' parameter to 'FlutterFormInputPassword'
|
* Addition of 'decoration' parameter to 'FlutterFormInputPassword'
|
||||||
|
|
||||||
|
## 3.0.0
|
||||||
|
* Updated the FlutterFormInputSwitch to FlutterFormInputBool. This now includes a parameter to either show a checkbox or switch
|
|
@ -55,7 +55,7 @@ class _MyHomePageState extends State<MyHomePage> {
|
||||||
children: [
|
children: [
|
||||||
Container(height: 10),
|
Container(height: 10),
|
||||||
const Text('FlutterFormInputSwitch'),
|
const Text('FlutterFormInputSwitch'),
|
||||||
FlutterFormInputSwitch(
|
FlutterFormInputBool(
|
||||||
initialValue: true,
|
initialValue: true,
|
||||||
onChanged: (v) {
|
onChanged: (v) {
|
||||||
debugPrint('Switch changed to $v');
|
debugPrint('Switch changed to $v');
|
||||||
|
|
|
@ -37,10 +37,10 @@ packages:
|
||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
name: collection
|
name: collection
|
||||||
sha256: f092b211a4319e98e5ff58223576de6c2803db36221657b46c82574721240687
|
sha256: ee67cb0715911d28db6bf4af1026078bd6f0128b07a5f66fb2ed94ec6783c09a
|
||||||
url: "https://pub.dev"
|
url: "https://pub.dev"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "1.17.2"
|
version: "1.18.0"
|
||||||
cupertino_icons:
|
cupertino_icons:
|
||||||
dependency: "direct main"
|
dependency: "direct main"
|
||||||
description:
|
description:
|
||||||
|
@ -68,7 +68,7 @@ packages:
|
||||||
path: ".."
|
path: ".."
|
||||||
relative: true
|
relative: true
|
||||||
source: path
|
source: path
|
||||||
version: "2.4.0"
|
version: "2.7.0"
|
||||||
flutter_lints:
|
flutter_lints:
|
||||||
dependency: "direct dev"
|
dependency: "direct dev"
|
||||||
description:
|
description:
|
||||||
|
@ -118,10 +118,10 @@ packages:
|
||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
name: meta
|
name: meta
|
||||||
sha256: "3c74dbf8763d36539f114c799d8a2d87343b5067e9d796ca22b5eb8437090ee3"
|
sha256: a6e590c838b18133bb482a2745ad77c5bb7715fb0451209e1a7567d416678b8e
|
||||||
url: "https://pub.dev"
|
url: "https://pub.dev"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "1.9.1"
|
version: "1.10.0"
|
||||||
path:
|
path:
|
||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
|
@ -147,18 +147,18 @@ packages:
|
||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
name: stack_trace
|
name: stack_trace
|
||||||
sha256: c3c7d8edb15bee7f0f74debd4b9c5f3c2ea86766fe4178eb2a18eb30a0bdaed5
|
sha256: "73713990125a6d93122541237550ee3352a2d84baad52d375a4cad2eb9b7ce0b"
|
||||||
url: "https://pub.dev"
|
url: "https://pub.dev"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "1.11.0"
|
version: "1.11.1"
|
||||||
stream_channel:
|
stream_channel:
|
||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
name: stream_channel
|
name: stream_channel
|
||||||
sha256: "83615bee9045c1d322bbbd1ba209b7a749c2cbcdcb3fdd1df8eb488b3279c1c8"
|
sha256: ba2aa5d8cc609d96bbb2899c28934f9e1af5cddbd60a827822ea467161eb54e7
|
||||||
url: "https://pub.dev"
|
url: "https://pub.dev"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "2.1.1"
|
version: "2.1.2"
|
||||||
string_scanner:
|
string_scanner:
|
||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
|
@ -179,10 +179,10 @@ packages:
|
||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
name: test_api
|
name: test_api
|
||||||
sha256: "75760ffd7786fffdfb9597c35c5b27eaeec82be8edfb6d71d32651128ed7aab8"
|
sha256: "5c2f730018264d276c20e4f1503fd1308dfbbae39ec8ee63c5236311ac06954b"
|
||||||
url: "https://pub.dev"
|
url: "https://pub.dev"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "0.6.0"
|
version: "0.6.1"
|
||||||
vector_math:
|
vector_math:
|
||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
|
@ -195,10 +195,10 @@ packages:
|
||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
name: web
|
name: web
|
||||||
sha256: dc8ccd225a2005c1be616fe02951e2e342092edf968cf0844220383757ef8f10
|
sha256: afe077240a270dcfd2aafe77602b4113645af95d0ad31128cc02bce5ac5d5152
|
||||||
url: "https://pub.dev"
|
url: "https://pub.dev"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "0.1.4-beta"
|
version: "0.3.0"
|
||||||
sdks:
|
sdks:
|
||||||
dart: ">=3.1.0-185.0.dev <4.0.0"
|
dart: ">=3.2.0-194.0.dev <4.0.0"
|
||||||
flutter: ">=1.17.0"
|
flutter: ">=1.17.0"
|
||||||
|
|
|
@ -4,17 +4,20 @@
|
||||||
|
|
||||||
import 'package:flutter/material.dart';
|
import 'package:flutter/material.dart';
|
||||||
|
|
||||||
import 'package:flutter_input_library/src/inputs/switch/switch_field.dart';
|
import 'package:flutter_input_library/src/inputs/bool/bool_field.dart';
|
||||||
|
|
||||||
class FlutterFormInputSwitch extends StatelessWidget {
|
class FlutterFormInputBool extends StatelessWidget {
|
||||||
final Widget? label;
|
final Widget? label;
|
||||||
final Function(bool?)? onSaved;
|
final Function(bool?)? onSaved;
|
||||||
final String? Function(bool?)? validator;
|
final String? Function(bool?)? validator;
|
||||||
final Function(bool?)? onChanged;
|
final Function(bool?)? onChanged;
|
||||||
final bool? initialValue;
|
final bool? initialValue;
|
||||||
final FocusNode? focusNode;
|
final FocusNode? focusNode;
|
||||||
|
final BoolWidgetType widgetType;
|
||||||
|
final Widget? leftWidget;
|
||||||
|
final Widget? rightWidget;
|
||||||
|
|
||||||
const FlutterFormInputSwitch({
|
const FlutterFormInputBool({
|
||||||
Key? key,
|
Key? key,
|
||||||
this.label,
|
this.label,
|
||||||
this.onSaved,
|
this.onSaved,
|
||||||
|
@ -22,18 +25,29 @@ class FlutterFormInputSwitch extends StatelessWidget {
|
||||||
this.onChanged,
|
this.onChanged,
|
||||||
this.focusNode,
|
this.focusNode,
|
||||||
this.initialValue = false,
|
this.initialValue = false,
|
||||||
|
this.widgetType = BoolWidgetType.switchWidget,
|
||||||
|
this.leftWidget,
|
||||||
|
this.rightWidget,
|
||||||
}) : super(
|
}) : super(
|
||||||
key: key,
|
key: key,
|
||||||
);
|
);
|
||||||
|
|
||||||
@override
|
@override
|
||||||
Widget build(BuildContext context) {
|
Widget build(BuildContext context) {
|
||||||
return SwitchFormField(
|
return BoolFormField(
|
||||||
onSaved: (value) => onSaved?.call(value),
|
onSaved: (value) => onSaved?.call(value),
|
||||||
onChanged: (value) => onChanged?.call(value),
|
onChanged: (value) => onChanged?.call(value),
|
||||||
validator: (value) => validator?.call(value),
|
validator: (value) => validator?.call(value),
|
||||||
initialValue: initialValue ?? false,
|
initialValue: initialValue ?? false,
|
||||||
focusNode: focusNode,
|
focusNode: focusNode,
|
||||||
|
widgetType: widgetType,
|
||||||
|
leftWidget: leftWidget,
|
||||||
|
rightWidget: rightWidget,
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
enum BoolWidgetType {
|
||||||
|
switchWidget,
|
||||||
|
checkbox,
|
||||||
|
}
|
127
lib/src/inputs/bool/bool_field.dart
Normal file
127
lib/src/inputs/bool/bool_field.dart
Normal file
|
@ -0,0 +1,127 @@
|
||||||
|
// SPDX-FileCopyrightText: 2022 Iconica
|
||||||
|
//
|
||||||
|
// SPDX-License-Identifier: BSD-3-Clause
|
||||||
|
|
||||||
|
import 'package:flutter/material.dart';
|
||||||
|
import 'package:flutter_input_library/flutter_input_library.dart';
|
||||||
|
|
||||||
|
class BoolFormField extends FormField<bool> {
|
||||||
|
BoolFormField({
|
||||||
|
Key? key,
|
||||||
|
required FormFieldSetter<bool> onSaved,
|
||||||
|
required FormFieldValidator<bool> validator,
|
||||||
|
FocusNode? focusNode,
|
||||||
|
bool initialValue = false,
|
||||||
|
bool autovalidate = false,
|
||||||
|
void Function(bool? value)? onChanged,
|
||||||
|
BoolWidgetType widgetType = BoolWidgetType.switchWidget,
|
||||||
|
Widget? leftWidget,
|
||||||
|
Widget? rightWidget,
|
||||||
|
}) : super(
|
||||||
|
key: key,
|
||||||
|
onSaved: onSaved,
|
||||||
|
validator: validator,
|
||||||
|
initialValue: initialValue,
|
||||||
|
builder: (FormFieldState<bool> state) {
|
||||||
|
return BoolWidget(
|
||||||
|
initialValue: initialValue,
|
||||||
|
state: state,
|
||||||
|
focusNode: focusNode,
|
||||||
|
onChanged: onChanged,
|
||||||
|
widgetType: widgetType,
|
||||||
|
errorText: state.errorText,
|
||||||
|
leftWidget: leftWidget,
|
||||||
|
rightWidget: rightWidget,
|
||||||
|
);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
class BoolWidget extends StatefulWidget {
|
||||||
|
const BoolWidget({
|
||||||
|
this.initialValue = false,
|
||||||
|
required this.state,
|
||||||
|
this.onChanged,
|
||||||
|
this.focusNode,
|
||||||
|
this.widgetType = BoolWidgetType.switchWidget,
|
||||||
|
this.errorText,
|
||||||
|
this.leftWidget,
|
||||||
|
this.rightWidget,
|
||||||
|
super.key,
|
||||||
|
});
|
||||||
|
|
||||||
|
final bool initialValue;
|
||||||
|
final FormFieldState<bool> state;
|
||||||
|
final FocusNode? focusNode;
|
||||||
|
final void Function(bool? value)? onChanged;
|
||||||
|
final BoolWidgetType widgetType;
|
||||||
|
final String? errorText;
|
||||||
|
final Widget? leftWidget;
|
||||||
|
final Widget? rightWidget;
|
||||||
|
|
||||||
|
@override
|
||||||
|
State<BoolWidget> createState() => _BoolWidgetState();
|
||||||
|
}
|
||||||
|
|
||||||
|
class _BoolWidgetState extends State<BoolWidget> {
|
||||||
|
late Widget child;
|
||||||
|
late bool value = widget.initialValue;
|
||||||
|
|
||||||
|
void onChanged(bool value) {
|
||||||
|
widget.onChanged?.call(value);
|
||||||
|
|
||||||
|
widget.state.didChange(value);
|
||||||
|
|
||||||
|
setState(() {
|
||||||
|
this.value = value;
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
@override
|
||||||
|
Widget build(BuildContext context) {
|
||||||
|
var theme = Theme.of(context);
|
||||||
|
|
||||||
|
late Widget child;
|
||||||
|
|
||||||
|
switch (widget.widgetType) {
|
||||||
|
case BoolWidgetType.switchWidget:
|
||||||
|
child = Switch(
|
||||||
|
value: value,
|
||||||
|
focusNode: widget.focusNode,
|
||||||
|
onChanged: onChanged,
|
||||||
|
);
|
||||||
|
break;
|
||||||
|
|
||||||
|
case BoolWidgetType.checkbox:
|
||||||
|
child = Checkbox(
|
||||||
|
value: value,
|
||||||
|
focusNode: widget.focusNode,
|
||||||
|
onChanged: (bool? value) {
|
||||||
|
if (value != null) {
|
||||||
|
onChanged(value);
|
||||||
|
}
|
||||||
|
},
|
||||||
|
);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
return Column(
|
||||||
|
mainAxisSize: MainAxisSize.min,
|
||||||
|
children: [
|
||||||
|
Row(
|
||||||
|
mainAxisSize: MainAxisSize.min,
|
||||||
|
children: [
|
||||||
|
widget.leftWidget ?? const SizedBox.shrink(),
|
||||||
|
child,
|
||||||
|
widget.rightWidget ?? const SizedBox.shrink(),
|
||||||
|
],
|
||||||
|
),
|
||||||
|
if (widget.errorText != null) ...[
|
||||||
|
Text(
|
||||||
|
widget.errorText!,
|
||||||
|
style: theme.inputDecorationTheme.errorStyle,
|
||||||
|
),
|
||||||
|
],
|
||||||
|
],
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
|
@ -3,6 +3,6 @@ export 'number_picker/number_picker.dart';
|
||||||
export 'text/password.dart';
|
export 'text/password.dart';
|
||||||
export 'text/plain_text.dart';
|
export 'text/plain_text.dart';
|
||||||
export 'slider/slider.dart';
|
export 'slider/slider.dart';
|
||||||
export 'switch/switch.dart';
|
export 'bool/bool.dart';
|
||||||
export 'date_picker/date_picker.dart';
|
export 'date_picker/date_picker.dart';
|
||||||
export 'scroll_picker/scroll_picker.dart';
|
export 'scroll_picker/scroll_picker.dart';
|
||||||
|
|
|
@ -1,68 +0,0 @@
|
||||||
// SPDX-FileCopyrightText: 2022 Iconica
|
|
||||||
//
|
|
||||||
// SPDX-License-Identifier: BSD-3-Clause
|
|
||||||
|
|
||||||
import 'package:flutter/material.dart';
|
|
||||||
|
|
||||||
class SwitchFormField extends FormField<bool> {
|
|
||||||
SwitchFormField({
|
|
||||||
Key? key,
|
|
||||||
required FormFieldSetter<bool> onSaved,
|
|
||||||
required FormFieldValidator<bool> validator,
|
|
||||||
FocusNode? focusNode,
|
|
||||||
bool initialValue = false,
|
|
||||||
bool autovalidate = false,
|
|
||||||
void Function(bool? value)? onChanged,
|
|
||||||
}) : super(
|
|
||||||
key: key,
|
|
||||||
onSaved: onSaved,
|
|
||||||
validator: validator,
|
|
||||||
initialValue: initialValue,
|
|
||||||
builder: (FormFieldState<bool> state) {
|
|
||||||
return SwitchWidget(
|
|
||||||
initialValue: initialValue,
|
|
||||||
state: state,
|
|
||||||
focusNode: focusNode,
|
|
||||||
onChanged: onChanged,
|
|
||||||
);
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
class SwitchWidget extends StatefulWidget {
|
|
||||||
const SwitchWidget({
|
|
||||||
this.initialValue = false,
|
|
||||||
required this.state,
|
|
||||||
this.onChanged,
|
|
||||||
this.focusNode,
|
|
||||||
super.key,
|
|
||||||
});
|
|
||||||
|
|
||||||
final bool initialValue;
|
|
||||||
final FormFieldState<bool> state;
|
|
||||||
final FocusNode? focusNode;
|
|
||||||
final void Function(bool? value)? onChanged;
|
|
||||||
|
|
||||||
@override
|
|
||||||
State<SwitchWidget> createState() => _SwitchWidgetState();
|
|
||||||
}
|
|
||||||
|
|
||||||
class _SwitchWidgetState extends State<SwitchWidget> {
|
|
||||||
late bool value = widget.initialValue;
|
|
||||||
|
|
||||||
@override
|
|
||||||
Widget build(BuildContext context) {
|
|
||||||
return Switch(
|
|
||||||
value: value,
|
|
||||||
focusNode: widget.focusNode,
|
|
||||||
onChanged: (bool value) {
|
|
||||||
widget.onChanged?.call(value);
|
|
||||||
|
|
||||||
widget.state.didChange(value);
|
|
||||||
|
|
||||||
setState(() {
|
|
||||||
this.value = value;
|
|
||||||
});
|
|
||||||
},
|
|
||||||
);
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -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: 2.7.0
|
version: 3.0.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