show method

void show(
  1. BuildContext context,
  2. T toast
)

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);
  });
}