web-dev-qa-db-fra.com

Flutter: Ajouter une ombre de boîte à un conteneur transparent

J'essaie de créer un widget qui rend l'un des cercles montrés dans ce image . C'est un cercle transparent avec une ombre de boîte. Le cercle doit indiquer la couleur ou l'image d'arrière-plan appliquée au conteneur parent. Le cercle est transparent mais ce que je vois est ceci : une ombre de boîte noire et non la couleur d'arrière-plan du parent. Aucune suggestion?

Voici ce que j'ai jusqu'à présent:

class TransParentCircle extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return Container(
        child: new Center(
          child: new Container(
            decoration: new BoxDecoration(
              border: new Border.all(width: 1.0, color: Colors.black),
              shape: BoxShape.circle,
              color: Colors.transparent,
              boxShadow: <BoxShadow>[
                BoxShadow(
                  color: Colors.black,
                  offset: Offset(1.0, 6.0),
                  blurRadius: 40.0,
                ),
              ],
            ),
            padding: EdgeInsets.all(16.0),
          ),
        ),
        width: 320.0,
        height: 240.0,
        margin: EdgeInsets.only(bottom: 16.0));
  }
}
7
bec

Comme vous pouvez le voir dans la classe BoxShadow, ils sous-classent la méthode toPaint() comme ceci:

Paint toPaint() {
  final Paint result = Paint()
    ..color = color
    ..maskFilter = MaskFilter.blur(BlurStyle.normal, blurSigma);
  assert(() {
    if (debugDisableShadows)
      result.maskFilter = null;
    return true;
  }());
  return result;
}

... avec BlurStyle.normal au lieu de BlurStyle.outer comme nous le voulions.

Créons simplement un BoxShadow personnalisé qui prend le BlurStyle comme paramètre.

import 'package:flutter/material.Dart';

class CustomBoxShadow extends BoxShadow {
  final BlurStyle blurStyle;

  const CustomBoxShadow({
    Color color = const Color(0xFF000000),
    Offset offset = Offset.zero,
    double blurRadius = 0.0,
    this.blurStyle = BlurStyle.normal,
  }) : super(color: color, offset: offset, blurRadius: blurRadius);

  @override
  Paint toPaint() {
    final Paint result = Paint()
      ..color = color
      ..maskFilter = MaskFilter.blur(this.blurStyle, blurSigma);
    assert(() {
      if (debugDisableShadows)
        result.maskFilter = null;
      return true;
    }());
    return result;
  }
}

Maintenant, nous pouvons l'utiliser comme ceci:

new CustomBoxShadow(
  color: Colors.black,
  offset: new Offset(5.0, 5.0),
  blurRadius: 5.0,
  blurStyle: BlurStyle.outer
)
12
mastohhh