Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Null safety migration applied #12

Open
wants to merge 1 commit into
base: master
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
16 changes: 8 additions & 8 deletions example/lib/main.dart
Original file line number Diff line number Diff line change
Expand Up @@ -60,14 +60,14 @@ class MyHomePage extends StatelessWidget {
);
}

Widget buildNavigationButton({String text, Function onPressedFn}) {
Widget buildNavigationButton({required String text, Function? onPressedFn}) {
return FlatButton(
color: Color.fromRGBO(255, 255, 255, 0.3),
textColor: Colors.white,
shape: RoundedRectangleBorder(
borderRadius: BorderRadius.circular(50.0),
),
onPressed: onPressedFn,
onPressed: onPressedFn as void Function()?,
child: Text(
text,
style: TextStyle(color: Colors.white, fontSize: 18.0),
Expand Down Expand Up @@ -105,7 +105,7 @@ class Basic extends StatelessWidget {
StreamBuilder(
stream: _dividerController.stream,
builder: (context, snapshot) =>
snapshot.hasData ? BasicScore(snapshot.data) : Container(),
snapshot.hasData ? BasicScore(snapshot.data as int) : Container(),
)
],
),
Expand All @@ -117,7 +117,7 @@ class Basic extends StatelessWidget {
}

class BasicScore extends StatelessWidget {
final int selected;
final int? selected;

final Map<int, String> labels = {
1: 'Purple',
Expand All @@ -132,7 +132,7 @@ class BasicScore extends StatelessWidget {

@override
Widget build(BuildContext context) {
return Text('${labels[selected]}',
return Text('${labels[selected!]}',
style: TextStyle(fontStyle: FontStyle.italic));
}
}
Expand Down Expand Up @@ -176,7 +176,7 @@ class Roulette extends StatelessWidget {
StreamBuilder(
stream: _dividerController.stream,
builder: (context, snapshot) =>
snapshot.hasData ? RouletteScore(snapshot.data) : Container(),
snapshot.hasData ? RouletteScore(snapshot.data as int) : Container(),
),
SizedBox(height: 30),
new RaisedButton(
Expand All @@ -196,7 +196,7 @@ class Roulette extends StatelessWidget {
}

class RouletteScore extends StatelessWidget {
final int selected;
final int? selected;

final Map<int, String> labels = {
1: '1000\$',
Expand All @@ -213,7 +213,7 @@ class RouletteScore extends StatelessWidget {

@override
Widget build(BuildContext context) {
return Text('${labels[selected]}',
return Text('${labels[selected!]}',
style: TextStyle(fontStyle: FontStyle.italic, fontSize: 24.0));
}
}
74 changes: 37 additions & 37 deletions lib/src/spinning_wheel.dart
Original file line number Diff line number Diff line change
Expand Up @@ -36,38 +36,38 @@ class SpinningWheel extends StatefulWidget {
final bool canInteractWhileSpinning;

/// will be rendered on top of the wheel and can be used to show a selector
final Image secondaryImage;
final Image? secondaryImage;

/// x dimension for the secondaty image, if provided
/// if provided, has to be smaller than widget height
final double secondaryImageHeight;
final double? secondaryImageHeight;

/// y dimension for the secondary image, if provided
/// if provided, has to be smaller than widget width
final double secondaryImageWidth;
final double? secondaryImageWidth;

/// can be used to fine tune the position for the secondary image, otherwise it will be centered
final double secondaryImageTop;
final double? secondaryImageTop;

/// can be used to fine tune the position for the secondary image, otherwise it will be centered
final double secondaryImageLeft;
final double? secondaryImageLeft;

/// callback function to be executed when the wheel selection changes
final Function onUpdate;
final Function? onUpdate;

/// callback function to be executed when the animation stops
final Function onEnd;
final Function? onEnd;

/// Stream<double> used to trigger an animation
/// if triggered in an animation it will stop it, unless canInteractWhileSpinning is false
/// the parameter is a double for pixelsPerSecond in axis Y, which defaults to 8000.0 as a medium-high velocity
final Stream shouldStartOrStop;
final Stream? shouldStartOrStop;

SpinningWheel(
this.image, {
@required this.width,
@required this.height,
@required this.dividers,
required this.width,
required this.height,
required this.dividers,
this.initialSpinAngle: 0.0,
this.spinResistance: 0.5,
this.canInteractWhileSpinning: true,
Expand All @@ -83,27 +83,27 @@ class SpinningWheel extends StatefulWidget {
assert(spinResistance > 0.0 && spinResistance <= 1.0),
assert(initialSpinAngle >= 0.0 && initialSpinAngle <= (2 * pi)),
assert(secondaryImage == null ||
(secondaryImageHeight <= height && secondaryImageWidth <= width));
(secondaryImageHeight! <= height && secondaryImageWidth! <= width));

@override
_SpinningWheelState createState() => _SpinningWheelState();
}

class _SpinningWheelState extends State<SpinningWheel>
with SingleTickerProviderStateMixin {
AnimationController _animationController;
Animation<double> _animation;
late AnimationController _animationController;
late Animation<double> _animation;

// we need to store if has the widget behaves differently depending on the status
// AnimationStatus _animationStatus = AnimationStatus.dismissed;

// it helps calculating the velocity based on position and pixels per second velocity and angle
SpinVelocity _spinVelocity;
NonUniformCircularMotion _motion;
late SpinVelocity _spinVelocity;
late NonUniformCircularMotion _motion;

// keeps the last local position on pan update
// we need it onPanEnd to calculate in which cuadrant the user was when last dragged
Offset _localPositionOnPanUpdate;
Offset? _localPositionOnPanUpdate;

// duration of the animation based on the initial velocity
double _totalDuration = 0;
Expand All @@ -112,28 +112,28 @@ class _SpinningWheelState extends State<SpinningWheel>
double _initialCircularVelocity = 0;

// angle for each divider: 2*pi / numberOfDividers
double _dividerAngle;
double? _dividerAngle;

// current (circular) distance (angle) covered during the animation
double _currentDistance = 0;

// initial spin angle when the wheels starts the animation
double _initialSpinAngle;
late double _initialSpinAngle;

// dividider which is selected (positive y-coord)
int _currentDivider;
int? _currentDivider;

// spining backwards
bool _isBackwards;
late bool _isBackwards;

// if the user drags outside the wheel, won't be able to get back in
DateTime _offsetOutsideTimestamp;
DateTime? _offsetOutsideTimestamp;

// will be used to do transformations between global and local
RenderBox _renderBox;
RenderBox? _renderBox;

// subscription to the stream used to trigger an animation
StreamSubscription _subscription;
StreamSubscription? _subscription;

@override
void initState() {
Expand All @@ -158,7 +158,7 @@ class _SpinningWheelState extends State<SpinningWheel>
});

if (widget.shouldStartOrStop != null) {
_subscription = widget.shouldStartOrStop.listen(_startOrStop);
_subscription = widget.shouldStartOrStop!.listen(_startOrStop);
}
}

Expand All @@ -176,11 +176,11 @@ class _SpinningWheelState extends State<SpinningWheel>

double get topSecondaryImage =>
widget.secondaryImageTop ??
(widget.height / 2) - (widget.secondaryImageHeight / 2);
(widget.height / 2) - (widget.secondaryImageHeight! / 2);

double get leftSecondaryImage =>
widget.secondaryImageLeft ??
(widget.width / 2) - (widget.secondaryImageWidth / 2);
(widget.width / 2) - (widget.secondaryImageWidth! / 2);

double get widthSecondaryImage => widget.secondaryImageWidth ?? widget.width;

Expand All @@ -203,7 +203,7 @@ class _SpinningWheelState extends State<SpinningWheel>
child: Container(child: widget.image),
builder: (context, child) {
_updateAnimationValues();
widget.onUpdate(_currentDivider);
widget.onUpdate?.call(_currentDivider);
return Transform.rotate(
angle: _initialSpinAngle + _currentDistance,
child: child,
Expand Down Expand Up @@ -232,9 +232,9 @@ class _SpinningWheelState extends State<SpinningWheel>
// transforms from global coordinates to local and store the value
void _updateLocalPosition(Offset position) {
if (_renderBox == null) {
_renderBox = context.findRenderObject();
_renderBox = context.findRenderObject() as RenderBox?;
}
_localPositionOnPanUpdate = _renderBox.globalToLocal(position);
_localPositionOnPanUpdate = _renderBox!.globalToLocal(position);
}

/// returns true if (x,y) is outside the boundaries from size
Expand All @@ -253,7 +253,7 @@ class _SpinningWheelState extends State<SpinningWheel>
}
// calculate current divider selected
var modulo = _motion.modulo(_currentDistance + _initialSpinAngle);
_currentDivider = widget.dividers - (modulo ~/ _dividerAngle);
_currentDivider = widget.dividers - (modulo ~/ _dividerAngle) as int?;
if (_animationController.isCompleted) {
_initialSpinAngle = modulo;
_currentDistance = 0;
Expand All @@ -268,10 +268,10 @@ class _SpinningWheelState extends State<SpinningWheel>

_updateLocalPosition(details.globalPosition);

if (_contains(_localPositionOnPanUpdate)) {
if (_contains(_localPositionOnPanUpdate!)) {
// we need to update the rotation
// so, calculate the new rotation angle and rebuild the widget
var angle = _spinVelocity.offsetToRadians(_localPositionOnPanUpdate);
var angle = _spinVelocity.offsetToRadians(_localPositionOnPanUpdate!);
setState(() {
// initialSpinAngle will be added later on build
_currentDistance = angle - _initialSpinAngle;
Expand All @@ -290,14 +290,14 @@ class _SpinningWheelState extends State<SpinningWheel>
_animationController.stop();
_animationController.reset();

widget.onEnd(_currentDivider);
widget.onEnd?.call(_currentDivider);
}

void _startAnimationOnPanEnd(DragEndDetails details) {
if (!_userCanInteract) return;

if (_offsetOutsideTimestamp != null) {
var difference = DateTime.now().difference(_offsetOutsideTimestamp);
var difference = DateTime.now().difference(_offsetOutsideTimestamp!);
_offsetOutsideTimestamp = null;
// if more than 50 seconds passed since user dragged outside the boundaries, dont start animation
if (difference.inMilliseconds > 50) return;
Expand All @@ -311,7 +311,7 @@ class _SpinningWheelState extends State<SpinningWheel>

void _startAnimation(Offset pixelsPerSecond) {
var velocity =
_spinVelocity.getVelocity(_localPositionOnPanUpdate, pixelsPerSecond);
_spinVelocity.getVelocity(_localPositionOnPanUpdate!, pixelsPerSecond);

_localPositionOnPanUpdate = null;
_isBackwards = velocity < 0;
Expand All @@ -328,7 +328,7 @@ class _SpinningWheelState extends State<SpinningWheel>
dispose() {
_animationController.dispose();
if (_subscription != null) {
_subscription.cancel();
_subscription!.cancel();
}
super.dispose();
}
Expand Down
6 changes: 3 additions & 3 deletions lib/src/utils.dart
Original file line number Diff line number Diff line change
Expand Up @@ -21,11 +21,11 @@ class SpinVelocity {
double get width_0_5 => width / 2;
double get height_0_5 => height / 2;

SpinVelocity({@required this.height, @required this.width});
SpinVelocity({required this.height, required this.width});

double getVelocity(Offset position, Offset pps) {
var cuadrantIndex = _getCuadrantFromOffset(position);
var cuadrant = cuadrants[cuadrantIndex];
var cuadrant = cuadrants[cuadrantIndex]!;
return (cuadrant.dx * pps.dx) + (cuadrant.dy * pps.dy);
}

Expand Down Expand Up @@ -53,7 +53,7 @@ class SpinVelocity {
class NonUniformCircularMotion {
final double resistance;

NonUniformCircularMotion({@required this.resistance});
NonUniformCircularMotion({required this.resistance});

/// returns the acceleration based on the resistance provided in the constructor
double get acceleration => resistance * -7 * pi;
Expand Down
Loading