build method

  1. @override
Widget build(
  1. BuildContext context,
  2. Widget child,
  3. AnimationController controller,
  4. EffectEntry entry,
)
override

Builds the widgets that implement the effect on the target child, based on the provided AnimationController and EffectEntry.

Implementation

@override
Widget build(
  BuildContext context,
  Widget child,
  AnimationController controller,
  EffectEntry entry,
) {
  double ratio = 1 / MediaQuery.of(context).devicePixelRatio;
  Animation<double> animation = buildAnimation(controller, entry);
  return getOptimizedBuilder<double>(
    animation: animation,
    builder: (_, __) {
      return AnimatedSampler(
        (ui.Image image, Size size, Canvas canvas) {
          ShaderUpdateDetails details = ShaderUpdateDetails(
            shader: shader!,
            value: animation.value,
            size: size,
            image: image,
          );

          EdgeInsets? insets = overflow;
          if (update != null) {
            insets ??= update!(details);
          } else {
            details.updateUniforms();
          }

          Rect rect = Rect.fromLTWH(0, 0, size.width, size.height);
          rect = insets?.inflateRect(rect) ?? rect;

          drawImage() {
            canvas.save();
            canvas.scale(ratio, ratio);
            canvas.drawImage(image, Offset.zero, Paint());
            canvas.restore();
          }

          if (layer == ShaderLayer.foreground) drawImage();
          if (shader != null) canvas.drawRect(rect, Paint()..shader = shader);
          if (layer == ShaderLayer.background) drawImage();
        },
        enabled: shader != null,
        child: child,
      );
    },
  );
}