m3eGradientSurfaceBuilder function

ButtonLayerBuilder? m3eGradientSurfaceBuilder({
  1. required BorderRadius clipRadius,
  2. WidgetStateProperty<Gradient?>? backgroundGradient,
  3. WidgetStateProperty<Gradient?>? overlayGradient,
  4. WidgetStateProperty<Gradient?>? outlineGradient,
  5. WidgetStateProperty<BorderSide?>? outlineSide,
  6. double outlineFallbackWidth = 1,
  7. ButtonLayerBuilder? explicitBuilder,
})

Fill, overlay, and outline for Material backgroundBuilder.

Outline is painted on the material bounds (the morphing pill), not the outer tap-target padding.

Implementation

ButtonLayerBuilder? m3eGradientSurfaceBuilder({
  required BorderRadius clipRadius,
  WidgetStateProperty<Gradient?>? backgroundGradient,
  WidgetStateProperty<Gradient?>? overlayGradient,
  WidgetStateProperty<Gradient?>? outlineGradient,
  WidgetStateProperty<BorderSide?>? outlineSide,
  double outlineFallbackWidth = 1,
  ButtonLayerBuilder? explicitBuilder,
}) {
  if (explicitBuilder == null &&
      backgroundGradient == null &&
      overlayGradient == null &&
      outlineGradient == null &&
      outlineSide == null) {
    return null;
  }
  final ButtonLayerBuilder? fill = m3eGradientBackgroundBuilder(
    clipRadius: clipRadius,
    gradient: backgroundGradient,
    explicitBuilder: explicitBuilder,
  );
  return (BuildContext context, Set<WidgetState> states, Widget? child) {
    Widget result = child ?? const SizedBox.shrink();
    if (fill != null) {
      result = fill(context, states, result);
    }
    result = m3eResolveGradientOverlay(
      clipRadius: clipRadius,
      states: states,
      overlayGradient: overlayGradient,
      child: result,
    );
    final Gradient? outline = outlineGradient?.resolve(states);
    final BorderSide? side = outlineSide?.resolve(states);
    final double width = m3eOutlineWidth(side, fallback: outlineFallbackWidth);
    if (outline != null ||
        (side != null && side.style != BorderStyle.none && outline == null)) {
      result = m3eGradientOutlineLayer(
        clipRadius: clipRadius,
        gradient: outline,
        color: outline == null ? side?.color : null,
        width: width,
        child: result,
      );
    }
    return result;
  };
}