new: controller command of newStack(int length) to allow for expansion and deletion of card stack data
This commit is contained in:
parent
5fb6777279
commit
d63bcd5c76
|
|
@ -15,16 +15,36 @@ class CardSwiperController {
|
||||||
_eventController.add(ControllerSwipeEvent(direction));
|
_eventController.add(ControllerSwipeEvent(direction));
|
||||||
}
|
}
|
||||||
|
|
||||||
// Undo the last swipe
|
/// Undo the last swipe
|
||||||
void undo() {
|
void undo() {
|
||||||
_eventController.add(const ControllerUndoEvent());
|
_eventController.add(const ControllerUndoEvent());
|
||||||
}
|
}
|
||||||
|
|
||||||
// Change the top card to a specific index.
|
/// Change the top card to a specific index.
|
||||||
void moveTo(int index) {
|
void moveTo(int index) {
|
||||||
_eventController.add(ControllerMoveEvent(index));
|
_eventController.add(ControllerMoveEvent(index));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// We have a new list of card data for this state machine to handle
|
||||||
|
/// 1. Set the length of the card list
|
||||||
|
/// 2. Move index to 0 (restart stack to first card)
|
||||||
|
void newStack(int length) {
|
||||||
|
_eventController.add(ControllerNewStackEvent(length));
|
||||||
|
}
|
||||||
|
|
||||||
|
/// We have a new added cards to the end
|
||||||
|
/// 0. Keep internal index the same (undo will work, can go backwards)
|
||||||
|
/// 1. Set the internal length of the card list
|
||||||
|
/// 2. Check if we need to redraw, if we are at end of card list
|
||||||
|
// void appendStack(int length) {
|
||||||
|
// _eventController.add(ControllerNewStackEvent(length));
|
||||||
|
// }
|
||||||
|
|
||||||
|
/// Set the length only, user can moveTo(0), or other actions
|
||||||
|
// void modifiedStack(int length) {
|
||||||
|
// _eventController.add(ControllerNewStackEvent(length));
|
||||||
|
// }
|
||||||
|
|
||||||
Future<void> dispose() async {
|
Future<void> dispose() async {
|
||||||
await _eventController.close();
|
await _eventController.close();
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -17,3 +17,8 @@ class ControllerMoveEvent extends ControllerEvent {
|
||||||
final int index;
|
final int index;
|
||||||
const ControllerMoveEvent(this.index);
|
const ControllerMoveEvent(this.index);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
class ControllerNewStackEvent extends ControllerEvent {
|
||||||
|
final int length;
|
||||||
|
const ControllerNewStackEvent(this.length);
|
||||||
|
}
|
||||||
|
|
|
||||||
|
|
@ -22,10 +22,20 @@ class _CardSwiperState<T extends Widget> extends State<CardSwiper>
|
||||||
|
|
||||||
StreamSubscription<ControllerEvent>? controllerSubscription;
|
StreamSubscription<ControllerEvent>? controllerSubscription;
|
||||||
|
|
||||||
|
late NullableCardBuilder _cardBuilder;
|
||||||
|
late int _cardsCount;
|
||||||
|
|
||||||
@override
|
@override
|
||||||
void initState() {
|
void initState() {
|
||||||
super.initState();
|
super.initState();
|
||||||
|
|
||||||
|
debugPrint('[WTF] _CardSwiperState.initState !!!');
|
||||||
|
debugPrint('[WTF] _CardSwiperState.initState !!!');
|
||||||
|
debugPrint('[WTF] _CardSwiperState.initState !!!');
|
||||||
|
|
||||||
|
_cardBuilder = widget.cardBuilder;
|
||||||
|
_cardsCount = widget.cardsCount;
|
||||||
|
|
||||||
_undoableIndex.state = widget.initialIndex;
|
_undoableIndex.state = widget.initialIndex;
|
||||||
|
|
||||||
controllerSubscription =
|
controllerSubscription =
|
||||||
|
|
@ -67,6 +77,11 @@ class _CardSwiperState<T extends Widget> extends State<CardSwiper>
|
||||||
|
|
||||||
@override
|
@override
|
||||||
void dispose() {
|
void dispose() {
|
||||||
|
|
||||||
|
debugPrint('[WTF] _CardSwiperState.dispose !!!');
|
||||||
|
debugPrint('[WTF] _CardSwiperState.dispose !!!');
|
||||||
|
debugPrint('[WTF] _CardSwiperState.dispose !!!');
|
||||||
|
|
||||||
_animationController.dispose();
|
_animationController.dispose();
|
||||||
controllerSubscription?.cancel();
|
controllerSubscription?.cancel();
|
||||||
super.dispose();
|
super.dispose();
|
||||||
|
|
@ -104,7 +119,7 @@ class _CardSwiperState<T extends Widget> extends State<CardSwiper>
|
||||||
angle: _cardAnimation.angle,
|
angle: _cardAnimation.angle,
|
||||||
child: ConstrainedBox(
|
child: ConstrainedBox(
|
||||||
constraints: constraints,
|
constraints: constraints,
|
||||||
child: widget.cardBuilder(
|
child: _cardBuilder(
|
||||||
context,
|
context,
|
||||||
_currentIndex!,
|
_currentIndex!,
|
||||||
(100 * _cardAnimation.left / widget.threshold).ceil(),
|
(100 * _cardAnimation.left / widget.threshold).ceil(),
|
||||||
|
|
@ -155,7 +170,7 @@ class _CardSwiperState<T extends Widget> extends State<CardSwiper>
|
||||||
scale: _cardAnimation.scale - ((1 - widget.scale) * (index - 1)),
|
scale: _cardAnimation.scale - ((1 - widget.scale) * (index - 1)),
|
||||||
child: ConstrainedBox(
|
child: ConstrainedBox(
|
||||||
constraints: constraints,
|
constraints: constraints,
|
||||||
child: widget.cardBuilder(context, getValidIndexOffset(index)!, 0, 0),
|
child: _cardBuilder(context, getValidIndexOffset(index)!, 0, 0),
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
);
|
);
|
||||||
|
|
@ -166,6 +181,8 @@ class _CardSwiperState<T extends Widget> extends State<CardSwiper>
|
||||||
ControllerSwipeEvent(:final direction) => _swipe(direction),
|
ControllerSwipeEvent(:final direction) => _swipe(direction),
|
||||||
ControllerUndoEvent() => _undo(),
|
ControllerUndoEvent() => _undo(),
|
||||||
ControllerMoveEvent(:final index) => _moveTo(index),
|
ControllerMoveEvent(:final index) => _moveTo(index),
|
||||||
|
// controller
|
||||||
|
ControllerNewStackEvent(:final length) => _newCardStack(length)
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -189,7 +206,7 @@ class _CardSwiperState<T extends Widget> extends State<CardSwiper>
|
||||||
}
|
}
|
||||||
|
|
||||||
Future<void> _handleCompleteSwipe() async {
|
Future<void> _handleCompleteSwipe() async {
|
||||||
final isLastCard = _currentIndex! == widget.cardsCount - 1;
|
final isLastCard = _currentIndex! == _cardsCount - 1;
|
||||||
final shouldCancelSwipe = await widget.onSwipe
|
final shouldCancelSwipe = await widget.onSwipe
|
||||||
?.call(_currentIndex!, _nextIndex, _detectedDirection) ==
|
?.call(_currentIndex!, _nextIndex, _detectedDirection) ==
|
||||||
false;
|
false;
|
||||||
|
|
@ -286,14 +303,20 @@ class _CardSwiperState<T extends Widget> extends State<CardSwiper>
|
||||||
}
|
}
|
||||||
|
|
||||||
void _moveTo(int index) {
|
void _moveTo(int index) {
|
||||||
|
debugPrint('[WTF] _moveTo() index: $index currentIndex: $_currentIndex cardsCount: $_cardsCount');
|
||||||
if (index == _currentIndex) return;
|
if (index == _currentIndex) return;
|
||||||
if (index < 0 || index >= widget.cardsCount) return;
|
if (index < 0 || index >= _cardsCount) return;
|
||||||
|
|
||||||
setState(() {
|
setState(() {
|
||||||
_undoableIndex.state = index;
|
_undoableIndex.state = index;
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void _newCardStack(int length) {
|
||||||
|
_cardsCount = length;
|
||||||
|
_moveTo(0); // move to first card, and force redraw if necessary
|
||||||
|
}
|
||||||
|
|
||||||
int numberOfCardsOnScreen() {
|
int numberOfCardsOnScreen() {
|
||||||
if (widget.isLoop) {
|
if (widget.isLoop) {
|
||||||
return widget.numberOfCardsDisplayed;
|
return widget.numberOfCardsDisplayed;
|
||||||
|
|
@ -304,7 +327,7 @@ class _CardSwiperState<T extends Widget> extends State<CardSwiper>
|
||||||
|
|
||||||
return math.min(
|
return math.min(
|
||||||
widget.numberOfCardsDisplayed,
|
widget.numberOfCardsDisplayed,
|
||||||
widget.cardsCount - _currentIndex!,
|
_cardsCount - _currentIndex!,
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -314,9 +337,9 @@ class _CardSwiperState<T extends Widget> extends State<CardSwiper>
|
||||||
}
|
}
|
||||||
|
|
||||||
final index = _currentIndex! + offset;
|
final index = _currentIndex! + offset;
|
||||||
if (!widget.isLoop && !index.isBetween(0, widget.cardsCount - 1)) {
|
if (!widget.isLoop && !index.isBetween(0, _cardsCount - 1)) {
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
return index % widget.cardsCount;
|
return index % _cardsCount;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue