From 11e27e7bfaeeb003c72af22b7b1d2b9f09dc6643 Mon Sep 17 00:00:00 2001 From: rjvysakh Date: Tue, 23 Nov 2021 11:22:55 +0530 Subject: [PATCH 1/5] feat: null safety and list [] --- lib/models/pad_button_item.dart | 12 ++-- lib/views/circle_view.dart | 28 +++++----- lib/views/joystick_view.dart | 46 ++++++++-------- lib/views/pad_button_view.dart | 62 ++++++++++----------- pubspec.lock | 97 +++++++++++---------------------- pubspec.yaml | 2 +- 6 files changed, 107 insertions(+), 140 deletions(-) diff --git a/lib/models/pad_button_item.dart b/lib/models/pad_button_item.dart index eac22d4..80ece91 100644 --- a/lib/models/pad_button_item.dart +++ b/lib/models/pad_button_item.dart @@ -7,25 +7,25 @@ import 'gestures.dart'; /// Model of one padd button. class PadButtonItem { /// [index] required parameter, the key to recognize button instance. - final int index; + final int? index; /// [buttonText] optional parameter, the text to be displayed inside the /// button. Omitted if [buttonImage] is set. Default value is empty string. - final String buttonText; + final String? buttonText; /// [buttonImage] optional parameter, image which will be displayed inside /// the button. - final Image buttonImage; + final Image? buttonImage; /// [buttonIcon] optional parameter, image which will be displayed inside /// the button. - final Icon buttonIcon; + final Icon? buttonIcon; /// [backgroundColor] color of button in default state. - final Color backgroundColor; + final Color? backgroundColor; /// [pressedColor] color of button when it is pressed. - final Color pressedColor; + final Color? pressedColor; /// [supportedGestures] optional parameter, list of gestures for button which /// will call the callback [PadButtonsView.padButtonPressedCallback]. diff --git a/lib/views/circle_view.dart b/lib/views/circle_view.dart index b201b4a..4430de8 100644 --- a/lib/views/circle_view.dart +++ b/lib/views/circle_view.dart @@ -2,21 +2,21 @@ import 'package:flutter/material.dart'; import 'package:flutter/widgets.dart'; class CircleView extends StatelessWidget { - final double size; + final double? size; - final Color color; + final Color? color; - final List boxShadow; + final List? boxShadow; - final Border border; + final Border? border; - final double opacity; + final double? opacity; - final Image buttonImage; + final Image? buttonImage; - final Icon buttonIcon; + final Icon? buttonIcon; - final String buttonText; + final String? buttonText; CircleView({ this.size, @@ -39,7 +39,9 @@ class CircleView extends StatelessWidget { ? buttonIcon : (buttonImage != null) ? buttonImage - : (buttonText != null) ? Text(buttonText) : null, + : (buttonText != null) + ? Text(buttonText!) + : null, ), decoration: BoxDecoration( color: color, @@ -85,9 +87,9 @@ class CircleView extends StatelessWidget { ], ); - factory CircleView.padBackgroundCircle( - double size, Color backgroundColour, borderColor, Color shadowColor, - {double opacity}) => + factory CircleView.padBackgroundCircle(double? size, Color? backgroundColour, + borderColor, Color? shadowColor, + {double? opacity}) => CircleView( size: size, color: backgroundColour, @@ -99,7 +101,7 @@ class CircleView extends StatelessWidget { ), boxShadow: [ BoxShadow( - color: shadowColor, + color: shadowColor!, spreadRadius: 8.0, blurRadius: 8.0, ) diff --git a/lib/views/joystick_view.dart b/lib/views/joystick_view.dart index bbc32b0..624ba7d 100644 --- a/lib/views/joystick_view.dart +++ b/lib/views/joystick_view.dart @@ -13,34 +13,34 @@ class JoystickView extends StatelessWidget { /// /// Defaults to half of the width in the portrait /// or half of the height in the landscape mode - final double size; + final double? size; /// Color of the icons /// /// Defaults to [Colors.white54] - final Color iconsColor; + final Color? iconsColor; /// Color of the joystick background /// /// Defaults to [Colors.blueGrey] - final Color backgroundColor; + final Color? backgroundColor; /// Color of the inner (smaller) circle background /// /// Defaults to [Colors.blueGrey] - final Color innerCircleColor; + final Color? innerCircleColor; /// Opacity of the joystick /// /// The opacity applies to the whole joystick including icons /// /// Defaults to [null] which means there will be no [Opacity] widget used - final double opacity; + final double? opacity; /// Callback to be called when user pans the joystick /// /// Defaults to [null] - final JoystickDirectionCallback onDirectionChanged; + final JoystickDirectionCallback? onDirectionChanged; /// Indicates how often the [onDirectionChanged] should be called. /// @@ -50,7 +50,7 @@ class JoystickView extends StatelessWidget { /// /// The exception is the [onDirectionChanged] callback being called /// on the [onPanStart] and [onPanEnd] callbacks. It will be called immediately. - final Duration interval; + final Duration? interval; /// Shows top/right/bottom/left arrows on top of Joystick /// @@ -69,17 +69,17 @@ class JoystickView extends StatelessWidget { @override Widget build(BuildContext context) { - double actualSize = size != null + double? actualSize = size != null ? size : _math.min(MediaQuery.of(context).size.width, MediaQuery.of(context).size.height) * 0.5; - double innerCircleSize = actualSize / 2; - Offset lastPosition = Offset(innerCircleSize, innerCircleSize); - Offset joystickInnerPosition = _calculatePositionOfInnerCircle( + double? innerCircleSize = actualSize! / 2; + Offset? lastPosition = Offset(innerCircleSize, innerCircleSize); + Offset? joystickInnerPosition = _calculatePositionOfInnerCircle( lastPosition, innerCircleSize, actualSize, Offset(0, 0)); - DateTime _callbackTimestamp; + DateTime? _callbackTimestamp; return Center( child: StatefulBuilder( @@ -88,15 +88,15 @@ class JoystickView extends StatelessWidget { children: [ CircleView.joystickCircle( actualSize, - backgroundColor, + backgroundColor!, ), Positioned( child: CircleView.joystickInnerCircle( actualSize / 2, - innerCircleColor, + innerCircleColor!, ), - top: joystickInnerPosition.dy, - left: joystickInnerPosition.dx, + top: joystickInnerPosition!.dy, + left: joystickInnerPosition!.dx, ), if (showArrows) ...createArrows(), ], @@ -105,13 +105,13 @@ class JoystickView extends StatelessWidget { return GestureDetector( onPanStart: (details) { _callbackTimestamp = _processGesture(actualSize, actualSize / 2, - details.localPosition, _callbackTimestamp); + details.localPosition, _callbackTimestamp!); setState(() => lastPosition = details.localPosition); }, onPanEnd: (details) { _callbackTimestamp = null; if (onDirectionChanged != null) { - onDirectionChanged(0, 0); + onDirectionChanged!(0, 0); } joystickInnerPosition = _calculatePositionOfInnerCircle( Offset(innerCircleSize, innerCircleSize), @@ -123,9 +123,9 @@ class JoystickView extends StatelessWidget { }, onPanUpdate: (details) { _callbackTimestamp = _processGesture(actualSize, actualSize / 2, - details.localPosition, _callbackTimestamp); + details.localPosition, _callbackTimestamp!); joystickInnerPosition = _calculatePositionOfInnerCircle( - lastPosition, + lastPosition!, innerCircleSize, actualSize, details.localPosition); @@ -133,7 +133,7 @@ class JoystickView extends StatelessWidget { setState(() => lastPosition = details.localPosition); }, child: (opacity != null) - ? Opacity(opacity: opacity, child: joystick) + ? Opacity(opacity: opacity!, child: joystick) : joystick, ); }, @@ -204,7 +204,7 @@ class JoystickView extends StatelessWidget { if (onDirectionChanged != null && _canCallOnDirectionChanged(callbackTimestamp)) { _callbackTimestamp = DateTime.now(); - onDirectionChanged(degrees, normalizedDistance); + onDirectionChanged!(degrees, normalizedDistance); } return _callbackTimestamp; @@ -216,7 +216,7 @@ class JoystickView extends StatelessWidget { /// or when there is no [interval] set. bool _canCallOnDirectionChanged(DateTime callbackTimestamp) { if (interval != null && callbackTimestamp != null) { - int intervalMilliseconds = interval.inMilliseconds; + int intervalMilliseconds = interval!.inMilliseconds; int timestampMilliseconds = callbackTimestamp.millisecondsSinceEpoch; int currentTimeMilliseconds = DateTime.now().millisecondsSinceEpoch; diff --git a/lib/views/pad_button_view.dart b/lib/views/pad_button_view.dart index 906d057..8d29981 100644 --- a/lib/views/pad_button_view.dart +++ b/lib/views/pad_button_view.dart @@ -16,23 +16,23 @@ class PadButtonsView extends StatelessWidget { /// recalculated for pad buttons size. /// /// Default value is calculated according to screen size. - final double size; + final double? size; /// List of pad buttons, default contains 4 buttons - final List buttons; + final List? buttons; /// [padButtonPressedCallback] contains information which button(index) was /// used by user and what gesture was done on it. - final PadButtonPressedCallback padButtonPressedCallback; + final PadButtonPressedCallback? padButtonPressedCallback; /// [buttonsStateMap] contains current colors of each button. - final Map buttonsStateMap = HashMap(); + final Map? buttonsStateMap = HashMap(); /// [buttonsPadding] optional parameter to ad paddings for buttons. - final double buttonsPadding; + final double? buttonsPadding; /// [backgroundPadButtonsColor] optional parameter, when set it shows circle. - final Color backgroundPadButtonsColor; + final Color? backgroundPadButtonsColor; PadButtonsView({ this.size, @@ -46,25 +46,25 @@ class PadButtonsView extends StatelessWidget { this.buttonsPadding = 0, this.backgroundPadButtonsColor = Colors.transparent, }) : assert(buttons != null && buttons.isNotEmpty) { - buttons.forEach( - (button) => buttonsStateMap[button.index] = button.backgroundColor); + buttons!.forEach( + (button) => buttonsStateMap![button.index!] = button.backgroundColor!); } @override Widget build(BuildContext context) { - double actualSize = size != null + double? actualSize = size != null ? size : _math.min(MediaQuery.of(context).size.width, MediaQuery.of(context).size.height) * 0.5; - double innerCircleSize = actualSize / 3; + double? innerCircleSize = actualSize! / 3; return Center( child: Stack(children: createButtons(innerCircleSize, actualSize))); } List createButtons(double innerCircleSize, double actualSize) { - List list = List(); + List list = []; list.add(CircleView.padBackgroundCircle( actualSize, backgroundPadButtonsColor, @@ -75,8 +75,8 @@ class PadButtonsView extends StatelessWidget { ? Colors.black12 : Colors.transparent)); - for (var i = 0; i < buttons.length; i++) { - var padButton = buttons[i]; + for (var i = 0; i < buttons!.length; i++) { + var padButton = buttons![i]; list.add(createPositionedButtons( padButton, actualSize, @@ -98,21 +98,21 @@ class PadButtonsView extends StatelessWidget { onTapUp: (details) { _processGesture(paddButton, Gestures.TAPUP); Future.delayed(const Duration(milliseconds: 50), () { - setState(() => buttonsStateMap[paddButton.index] = - paddButton.backgroundColor); + setState(() => buttonsStateMap![paddButton.index!] = + paddButton.backgroundColor!); }); }, onTapDown: (details) { _processGesture(paddButton, Gestures.TAPDOWN); setState(() => - buttonsStateMap[paddButton.index] = paddButton.pressedColor); + buttonsStateMap![paddButton.index!] = paddButton.pressedColor!); }, onTapCancel: () { _processGesture(paddButton, Gestures.TAPCANCEL); - setState(() => - buttonsStateMap[paddButton.index] = paddButton.backgroundColor); + setState(() => buttonsStateMap![paddButton.index!] = + paddButton.backgroundColor!); }, onLongPress: () { _processGesture(paddButton, Gestures.LONGPRESS); @@ -121,22 +121,22 @@ class PadButtonsView extends StatelessWidget { _processGesture(paddButton, Gestures.LONGPRESSSTART); setState(() => - buttonsStateMap[paddButton.index] = paddButton.pressedColor); + buttonsStateMap![paddButton.index!] = paddButton.pressedColor!); }, onLongPressUp: () { _processGesture(paddButton, Gestures.LONGPRESSUP); - setState(() => - buttonsStateMap[paddButton.index] = paddButton.backgroundColor); + setState(() => buttonsStateMap![paddButton.index!] = + paddButton.backgroundColor!); }, child: Padding( - padding: EdgeInsets.all(buttonsPadding), + padding: EdgeInsets.all(buttonsPadding!), child: CircleView.padButtonCircle( innerCircleSize, - buttonsStateMap[paddButton.index], - paddButton.buttonImage, - paddButton.buttonIcon, - paddButton.buttonText), + buttonsStateMap![paddButton.index]!, + paddButton.buttonImage!, + paddButton.buttonIcon!, + paddButton.buttonText!), ), ); }), @@ -148,28 +148,28 @@ class PadButtonsView extends StatelessWidget { void _processGesture(PadButtonItem button, Gestures gesture) { if (padButtonPressedCallback != null && button.supportedGestures.contains(gesture)) { - padButtonPressedCallback(button.index, gesture); + padButtonPressedCallback!(button.index!, gesture); print("$gesture paddbutton id = ${[button.index]}"); } } double _calculatePositionXOfButton( int index, double innerCircleSize, double actualSize) { - double degrees = 360 / buttons.length * index; + double degrees = 360 / buttons!.length * index; double lastAngleRadians = (degrees) * (_math.pi / 180.0); var rBig = actualSize / 2; - var rSmall = (innerCircleSize + 2 * buttonsPadding) / 2; + var rSmall = (innerCircleSize + 2 * buttonsPadding!) / 2; return (rBig - rSmall) + (rBig - rSmall) * _math.cos(lastAngleRadians); } double _calculatePositionYOfButton( int index, double innerCircleSize, double actualSize) { - double degrees = 360 / buttons.length * index; + double degrees = 360 / buttons!.length * index; double lastAngleRadians = (degrees) * (_math.pi / 180.0); var rBig = actualSize / 2; - var rSmall = (innerCircleSize + 2 * buttonsPadding) / 2; + var rSmall = (innerCircleSize + 2 * buttonsPadding!) / 2; return (rBig - rSmall) + (rBig - rSmall) * _math.sin(lastAngleRadians); } diff --git a/pubspec.lock b/pubspec.lock index ea53bf7..435e8ad 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -1,62 +1,55 @@ # Generated by pub # See https://dart.dev/tools/pub/glossary#lockfile packages: - archive: - dependency: transitive - description: - name: archive - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.11" - args: - dependency: transitive - description: - name: args - url: "https://pub.dartlang.org" - source: hosted - version: "1.5.2" async: dependency: transitive description: name: async url: "https://pub.dartlang.org" source: hosted - version: "2.4.0" + version: "2.8.1" boolean_selector: dependency: transitive description: name: boolean_selector url: "https://pub.dartlang.org" source: hosted - version: "1.0.5" + version: "2.1.0" + characters: + dependency: transitive + description: + name: characters + url: "https://pub.dartlang.org" + source: hosted + version: "1.1.0" charcode: dependency: transitive description: name: charcode url: "https://pub.dartlang.org" source: hosted - version: "1.1.2" - collection: + version: "1.3.1" + clock: dependency: transitive description: - name: collection + name: clock url: "https://pub.dartlang.org" source: hosted - version: "1.14.11" - convert: + version: "1.1.0" + collection: dependency: transitive description: - name: convert + name: collection url: "https://pub.dartlang.org" source: hosted - version: "2.1.1" - crypto: + version: "1.15.0" + fake_async: dependency: transitive description: - name: crypto + name: fake_async url: "https://pub.dartlang.org" source: hosted - version: "2.1.3" + version: "1.2.0" flutter: dependency: "direct main" description: flutter @@ -67,34 +60,27 @@ packages: description: flutter source: sdk version: "0.0.0" - image: - dependency: transitive - description: - name: image - url: "https://pub.dartlang.org" - source: hosted - version: "2.1.4" matcher: dependency: transitive description: name: matcher url: "https://pub.dartlang.org" source: hosted - version: "0.12.6" + version: "0.12.10" meta: dependency: transitive description: name: meta url: "https://pub.dartlang.org" source: hosted - version: "1.1.8" + version: "1.7.0" path: dependency: transitive description: name: path url: "https://pub.dartlang.org" source: hosted - version: "1.6.4" + version: "1.8.0" pedantic: dependency: "direct dev" description: @@ -102,20 +88,6 @@ packages: url: "https://pub.dartlang.org" source: hosted version: "1.8.0+1" - petitparser: - dependency: transitive - description: - name: petitparser - url: "https://pub.dartlang.org" - source: hosted - version: "2.4.0" - quiver: - dependency: transitive - description: - name: quiver - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.5" sky_engine: dependency: transitive description: flutter @@ -127,62 +99,55 @@ packages: name: source_span url: "https://pub.dartlang.org" source: hosted - version: "1.5.5" + version: "1.8.1" stack_trace: dependency: transitive description: name: stack_trace url: "https://pub.dartlang.org" source: hosted - version: "1.9.3" + version: "1.10.0" stream_channel: dependency: transitive description: name: stream_channel url: "https://pub.dartlang.org" source: hosted - version: "2.0.0" + version: "2.1.0" string_scanner: dependency: transitive description: name: string_scanner url: "https://pub.dartlang.org" source: hosted - version: "1.0.5" + version: "1.1.0" term_glyph: dependency: transitive description: name: term_glyph url: "https://pub.dartlang.org" source: hosted - version: "1.1.0" + version: "1.2.0" test_api: dependency: transitive description: name: test_api url: "https://pub.dartlang.org" source: hosted - version: "0.2.11" + version: "0.4.2" typed_data: dependency: transitive description: name: typed_data url: "https://pub.dartlang.org" source: hosted - version: "1.1.6" + version: "1.3.0" vector_math: dependency: transitive description: name: vector_math url: "https://pub.dartlang.org" source: hosted - version: "2.0.8" - xml: - dependency: transitive - description: - name: xml - url: "https://pub.dartlang.org" - source: hosted - version: "3.5.0" + version: "2.1.0" sdks: - dart: ">=2.4.0 <3.0.0" + dart: ">=2.12.0 <3.0.0" diff --git a/pubspec.yaml b/pubspec.yaml index 68db99d..c95cd38 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -4,7 +4,7 @@ version: 1.1.1+1 homepage: https://github.com/artrmz/flutter_control_pad environment: - sdk: ">=2.2.2 <3.0.0" + sdk: ">=2.12.0 <3.0.0" dependencies: flutter: From b0de209a5270b37f87360b2b9e5daf605bba351a Mon Sep 17 00:00:00 2001 From: rjvysakh Date: Tue, 23 Nov 2021 12:07:57 +0530 Subject: [PATCH 2/5] fix: unnecessary checks removed --- lib/views/joystick_view.dart | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/views/joystick_view.dart b/lib/views/joystick_view.dart index 624ba7d..a692c7c 100644 --- a/lib/views/joystick_view.dart +++ b/lib/views/joystick_view.dart @@ -215,7 +215,7 @@ class JoystickView extends StatelessWidget { /// Returns true if enough time has passed since last time it was called /// or when there is no [interval] set. bool _canCallOnDirectionChanged(DateTime callbackTimestamp) { - if (interval != null && callbackTimestamp != null) { + if (interval != null) { int intervalMilliseconds = interval!.inMilliseconds; int timestampMilliseconds = callbackTimestamp.millisecondsSinceEpoch; int currentTimeMilliseconds = DateTime.now().millisecondsSinceEpoch; From 706b2196279dd4e4d8d14a5748c30d1dd927b2b7 Mon Sep 17 00:00:00 2001 From: rjvysakh Date: Tue, 23 Nov 2021 12:26:47 +0530 Subject: [PATCH 3/5] fix: fixed more items --- lib/views/circle_view.dart | 13 +++--- lib/views/joystick_view.dart | 81 ++++++++++++++++++---------------- lib/views/pad_button_view.dart | 37 +++++++++------- pubspec.lock | 2 +- pubspec.yaml | 2 +- 5 files changed, 71 insertions(+), 64 deletions(-) diff --git a/lib/views/circle_view.dart b/lib/views/circle_view.dart index 4430de8..1766eae 100644 --- a/lib/views/circle_view.dart +++ b/lib/views/circle_view.dart @@ -34,7 +34,14 @@ class CircleView extends StatelessWidget { return Container( width: size, height: size, + decoration: BoxDecoration( + color: color, + shape: BoxShape.circle, + border: border, + boxShadow: boxShadow, + ), child: Center( + // ignore: prefer_if_null_operators child: buttonIcon != null ? buttonIcon : (buttonImage != null) @@ -43,12 +50,6 @@ class CircleView extends StatelessWidget { ? Text(buttonText!) : null, ), - decoration: BoxDecoration( - color: color, - shape: BoxShape.circle, - border: border, - boxShadow: boxShadow, - ), ); } diff --git a/lib/views/joystick_view.dart b/lib/views/joystick_view.dart index a692c7c..4cfc85c 100644 --- a/lib/views/joystick_view.dart +++ b/lib/views/joystick_view.dart @@ -69,11 +69,14 @@ class JoystickView extends StatelessWidget { @override Widget build(BuildContext context) { - double? actualSize = size != null - ? size - : _math.min(MediaQuery.of(context).size.width, - MediaQuery.of(context).size.height) * - 0.5; + double? actualSize; + if (size != null) { + actualSize = size; + } else { + actualSize = _math.min(MediaQuery.of(context).size.width, + MediaQuery.of(context).size.height) * + 0.5; + } double? innerCircleSize = actualSize! / 2; Offset? lastPosition = Offset(innerCircleSize, innerCircleSize); Offset? joystickInnerPosition = _calculatePositionOfInnerCircle( @@ -87,16 +90,16 @@ class JoystickView extends StatelessWidget { Widget joystick = Stack( children: [ CircleView.joystickCircle( - actualSize, + actualSize!, backgroundColor!, ), Positioned( + top: joystickInnerPosition!.dy, + left: joystickInnerPosition!.dx, child: CircleView.joystickInnerCircle( actualSize / 2, innerCircleColor!, ), - top: joystickInnerPosition!.dy, - left: joystickInnerPosition!.dx, ), if (showArrows) ...createArrows(), ], @@ -104,7 +107,7 @@ class JoystickView extends StatelessWidget { return GestureDetector( onPanStart: (details) { - _callbackTimestamp = _processGesture(actualSize, actualSize / 2, + _callbackTimestamp = _processGesture(actualSize!, actualSize / 2, details.localPosition, _callbackTimestamp!); setState(() => lastPosition = details.localPosition); }, @@ -116,13 +119,13 @@ class JoystickView extends StatelessWidget { joystickInnerPosition = _calculatePositionOfInnerCircle( Offset(innerCircleSize, innerCircleSize), innerCircleSize, - actualSize, + actualSize!, Offset(0, 0)); setState(() => lastPosition = Offset(innerCircleSize, innerCircleSize)); }, onPanUpdate: (details) { - _callbackTimestamp = _processGesture(actualSize, actualSize / 2, + _callbackTimestamp = _processGesture(actualSize!, actualSize / 2, details.localPosition, _callbackTimestamp!); joystickInnerPosition = _calculatePositionOfInnerCircle( lastPosition!, @@ -144,63 +147,63 @@ class JoystickView extends StatelessWidget { List createArrows() { return [ Positioned( + top: 16.0, + left: 0.0, + right: 0.0, child: Icon( Icons.arrow_upward, color: iconsColor, ), - top: 16.0, - left: 0.0, - right: 0.0, ), Positioned( + top: 0.0, + bottom: 0.0, + left: 16.0, child: Icon( Icons.arrow_back, color: iconsColor, ), - top: 0.0, - bottom: 0.0, - left: 16.0, ), Positioned( + top: 0.0, + bottom: 0.0, + right: 16.0, child: Icon( Icons.arrow_forward, color: iconsColor, ), - top: 0.0, - bottom: 0.0, - right: 16.0, ), Positioned( + bottom: 16.0, + left: 0.0, + right: 0.0, child: Icon( Icons.arrow_downward, color: iconsColor, ), - bottom: 16.0, - left: 0.0, - right: 0.0, ), ]; } DateTime _processGesture(double size, double ignoreSize, Offset offset, DateTime callbackTimestamp) { - double middle = size / 2.0; + double? middle = size / 2.0; - double angle = _math.atan2(offset.dy - middle, offset.dx - middle); - double degrees = angle * 180 / _math.pi + 90; + double? angle = _math.atan2(offset.dy - middle, offset.dx - middle); + double? degrees = angle * 180 / _math.pi + 90; if (offset.dx < middle && offset.dy < middle) { degrees = 360 + degrees; } - double dx = _math.max(0, _math.min(offset.dx, size)); - double dy = _math.max(0, _math.min(offset.dy, size)); + double? dx = _math.max(0, _math.min(offset.dx, size)); + double? dy = _math.max(0, _math.min(offset.dy, size)); - double distance = + double? distance = _math.sqrt(_math.pow(middle - dx, 2) + _math.pow(middle - dy, 2)); - double normalizedDistance = _math.min(distance / (size / 2), 1.0); + double? normalizedDistance = _math.min(distance / (size / 2), 1.0); - DateTime _callbackTimestamp = callbackTimestamp; + DateTime? _callbackTimestamp = callbackTimestamp; if (onDirectionChanged != null && _canCallOnDirectionChanged(callbackTimestamp)) { _callbackTimestamp = DateTime.now(); @@ -216,9 +219,9 @@ class JoystickView extends StatelessWidget { /// or when there is no [interval] set. bool _canCallOnDirectionChanged(DateTime callbackTimestamp) { if (interval != null) { - int intervalMilliseconds = interval!.inMilliseconds; - int timestampMilliseconds = callbackTimestamp.millisecondsSinceEpoch; - int currentTimeMilliseconds = DateTime.now().millisecondsSinceEpoch; + int? intervalMilliseconds = interval!.inMilliseconds; + int? timestampMilliseconds = callbackTimestamp.millisecondsSinceEpoch; + int? currentTimeMilliseconds = DateTime.now().millisecondsSinceEpoch; if (currentTimeMilliseconds - timestampMilliseconds <= intervalMilliseconds) { @@ -231,16 +234,16 @@ class JoystickView extends StatelessWidget { Offset _calculatePositionOfInnerCircle( Offset lastPosition, double innerCircleSize, double size, Offset offset) { - double middle = size / 2.0; + double? middle = size / 2.0; - double angle = _math.atan2(offset.dy - middle, offset.dx - middle); - double degrees = angle * 180 / _math.pi; + double? angle = _math.atan2(offset.dy - middle, offset.dx - middle); + double? degrees = angle * 180 / _math.pi; if (offset.dx < middle && offset.dy < middle) { degrees = 360 + degrees; } - bool isStartPosition = lastPosition.dx == innerCircleSize && + bool? isStartPosition = lastPosition.dx == innerCircleSize && lastPosition.dy == innerCircleSize; - double lastAngleRadians = + double? lastAngleRadians = (isStartPosition) ? 0 : (degrees) * (_math.pi / 180.0); var rBig = size / 2; diff --git a/lib/views/pad_button_view.dart b/lib/views/pad_button_view.dart index 8d29981..2bb121a 100644 --- a/lib/views/pad_button_view.dart +++ b/lib/views/pad_button_view.dart @@ -37,10 +37,10 @@ class PadButtonsView extends StatelessWidget { PadButtonsView({ this.size, this.buttons = const [ - PadButtonItem(index: 0, buttonText: "A"), - PadButtonItem(index: 1, buttonText: "B", pressedColor: Colors.red), - PadButtonItem(index: 2, buttonText: "C", pressedColor: Colors.green), - PadButtonItem(index: 3, buttonText: "D", pressedColor: Colors.yellow), + PadButtonItem(index: 0, buttonText: 'A'), + PadButtonItem(index: 1, buttonText: 'B', pressedColor: Colors.red), + PadButtonItem(index: 2, buttonText: 'C', pressedColor: Colors.green), + PadButtonItem(index: 3, buttonText: 'D', pressedColor: Colors.yellow), ], this.padButtonPressedCallback, this.buttonsPadding = 0, @@ -52,11 +52,14 @@ class PadButtonsView extends StatelessWidget { @override Widget build(BuildContext context) { - double? actualSize = size != null - ? size - : _math.min(MediaQuery.of(context).size.width, - MediaQuery.of(context).size.height) * - 0.5; + double? actualSize; + if (size != null) { + actualSize = size; + } else { + actualSize = _math.min(MediaQuery.of(context).size.width, + MediaQuery.of(context).size.height) * + 0.5; + } double? innerCircleSize = actualSize! / 3; return Center( @@ -64,7 +67,7 @@ class PadButtonsView extends StatelessWidget { } List createButtons(double innerCircleSize, double actualSize) { - List list = []; + List? list = []; list.add(CircleView.padBackgroundCircle( actualSize, backgroundPadButtonsColor, @@ -90,6 +93,8 @@ class PadButtonsView extends StatelessWidget { Positioned createPositionedButtons(PadButtonItem paddButton, double actualSize, int index, double innerCircleSize) { return Positioned( + top: _calculatePositionYOfButton(index, innerCircleSize, actualSize), + left: _calculatePositionXOfButton(index, innerCircleSize, actualSize), child: StatefulBuilder(builder: (context, setState) { return GestureDetector( onTap: () { @@ -140,8 +145,6 @@ class PadButtonsView extends StatelessWidget { ), ); }), - top: _calculatePositionYOfButton(index, innerCircleSize, actualSize), - left: _calculatePositionXOfButton(index, innerCircleSize, actualSize), ); } @@ -149,14 +152,14 @@ class PadButtonsView extends StatelessWidget { if (padButtonPressedCallback != null && button.supportedGestures.contains(gesture)) { padButtonPressedCallback!(button.index!, gesture); - print("$gesture paddbutton id = ${[button.index]}"); + print('$gesture paddbutton id = ${[button.index]}'); } } double _calculatePositionXOfButton( int index, double innerCircleSize, double actualSize) { - double degrees = 360 / buttons!.length * index; - double lastAngleRadians = (degrees) * (_math.pi / 180.0); + double? degrees = 360 / buttons!.length * index; + double? lastAngleRadians = (degrees) * (_math.pi / 180.0); var rBig = actualSize / 2; var rSmall = (innerCircleSize + 2 * buttonsPadding!) / 2; @@ -166,8 +169,8 @@ class PadButtonsView extends StatelessWidget { double _calculatePositionYOfButton( int index, double innerCircleSize, double actualSize) { - double degrees = 360 / buttons!.length * index; - double lastAngleRadians = (degrees) * (_math.pi / 180.0); + double? degrees = 360 / buttons!.length * index; + double? lastAngleRadians = (degrees) * (_math.pi / 180.0); var rBig = actualSize / 2; var rSmall = (innerCircleSize + 2 * buttonsPadding!) / 2; diff --git a/pubspec.lock b/pubspec.lock index 435e8ad..d272e16 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -87,7 +87,7 @@ packages: name: pedantic url: "https://pub.dartlang.org" source: hosted - version: "1.8.0+1" + version: "1.11.1" sky_engine: dependency: transitive description: flutter diff --git a/pubspec.yaml b/pubspec.yaml index c95cd38..7b67912 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -12,7 +12,7 @@ dependencies: dev_dependencies: pedantic: ^1.0.0 - flutter_test: + flutter_test: sdk: flutter flutter: From 66bd131e650aefbdaba9d6d71a9a5033689fc8e0 Mon Sep 17 00:00:00 2001 From: rjvysakh Date: Tue, 23 Nov 2021 12:33:35 +0530 Subject: [PATCH 4/5] fix: dart 2.14 --- pubspec.lock | 2 +- pubspec.yaml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/pubspec.lock b/pubspec.lock index d272e16..1e6529a 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -150,4 +150,4 @@ packages: source: hosted version: "2.1.0" sdks: - dart: ">=2.12.0 <3.0.0" + dart: ">=2.14.0 <3.0.0" diff --git a/pubspec.yaml b/pubspec.yaml index 7b67912..0cf953b 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -4,7 +4,7 @@ version: 1.1.1+1 homepage: https://github.com/artrmz/flutter_control_pad environment: - sdk: ">=2.12.0 <3.0.0" + sdk: ">=2.14.0 <3.0.0" dependencies: flutter: From 455dbfe93b0610fc6825d28e0b9946f2251d8e85 Mon Sep 17 00:00:00 2001 From: rjvysakh Date: Tue, 23 Nov 2021 12:54:33 +0530 Subject: [PATCH 5/5] fix: added test --- test/control_pad_test.dart | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/test/control_pad_test.dart b/test/control_pad_test.dart index 8faae66..778879d 100644 --- a/test/control_pad_test.dart +++ b/test/control_pad_test.dart @@ -1,7 +1,12 @@ // import 'package:flutter_test/flutter_test.dart'; // import 'package:control_pad/control_pad.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter_test/flutter_test.dart'; + void main() { - // test('adds one to input values', () { - // }); + testWidgets('Counter increments smoke test', (WidgetTester tester) async { + // Build our app and trigger a frame. + await tester.pumpWidget(MaterialApp()); + }); }