show method
Implementation
void show(BuildContext context, T toast) {
if (!_isOverlayVisible) {
try {
_overlayEntry = OverlayEntry(
builder: (context) {
return SafeArea(
child: Align(
alignment: widget.position,
child: Material(
color: Colors.transparent,
child: Container(
constraints: BoxConstraints(maxWidth: widget.width),
child: AnimatedList(
reverse: widget.reverse,
key: _animatedListKey,
initialItemCount: _listItemNotifier.listItem.length,
physics: const NeverScrollableScrollPhysics(),
shrinkWrap: true,
itemBuilder: (context, index, animation) {
final listItem = _listItemNotifier.listItem[index];
return widget.itemBuilder(
context,
listItem,
index,
animation,
);
},
),
),
),
),
);
},
);
Overlay.of(context).insert(_overlayEntry!);
_isOverlayVisible = true;
} catch (e) {
debugPrint('ToastListOverlay $e');
}
}
SchedulerBinding.instance.addPostFrameCallback((_) {
// executes after build'
if (_listItemNotifier.listItem.isEmpty) {
countdownTimer = Timer.periodic(
const Duration(milliseconds: 500),
(timer) {
if (_listItemNotifier.listItem.isEmpty) timer.cancel();
final currentTime = DateTime.now().millisecondsSinceEpoch;
final overTimedItems = timerList.where(
(time) {
final difference = currentTime - time.time;
final maxDuration = widget.timeoutDuration.inMilliseconds;
if (difference >= maxDuration) return true;
return false;
},
).toList();
for (var overTimedItem in overTimedItems) {
removeItem(
overTimedItem.item,
(context, animation) => widget.itemBuilder(
context,
overTimedItem.item,
overTimedItem.index,
animation,
),
);
}
},
);
}
if (_listItemNotifier.listItem.length == widget.limit) {
final lastItem = _listItemNotifier.listItem.last;
removeItem(
lastItem,
(context, animation) => widget.itemBuilder(
context,
lastItem,
_listItemNotifier.listItem.indexOf(lastItem),
animation,
),
);
}
timerList.insert(
0,
ToastTimer(
DateTime.now().millisecondsSinceEpoch,
widget.timeoutDuration,
toast,
0,
),
);
_listItemNotifier.insert(0, toast);
_animatedListKey.currentState?.insertItem(0);
});
}