Image de coins arrondis dans Flutter

122

J'utilise Flutter pour faire une liste d'informations sur les films. Maintenant, je veux que l'image de couverture sur la gauche soit une image aux coins arrondis. J'ai fait ce qui suit, mais cela n'a pas fonctionné. Merci!

    getItem(var subject) {
    var row = Container(
      margin: EdgeInsets.all(8.0),
      child: Row(
        children: <Widget>[
          Container(
            width: 100.0,
            height: 150.0,
            decoration: BoxDecoration(
              borderRadius: BorderRadius.all(Radius.circular(8.0)),
              color: Colors.redAccent,
            ),
            child: Image.network(
              subject['images']['large'],
              height: 150.0,
              width: 100.0,
            ),
          ),
        ],
      ),
    );
    return Card(
      color: Colors.blueGrey,
      child: row,
    );
  }

comme suit

entrez la description de l'image ici

Liu Silong
la source
Avez-vous compris pourquoi cette méthode ne fonctionne pas?
Martin

Réponses:

356

Utilisez ClipRRect-le fonctionnera parfaitement

ClipRRect(
    borderRadius: BorderRadius.circular(8.0),
    child: Image.network(
        subject['images']['large'],
        height: 150.0,
        width: 100.0,
    ),
)
Abdi Hamid
la source
9
Merci ! Je l'ai fait comme vous l'avez dit, puis ajouté fit: BoxFit.fill, ça a l'air plutôt bien.
Liu Silong
2
Merci - avez-vous une idée sur la façon de créer une bordure colorée sur l'image clipRRect'ed?
iKK
3
@iKK - Enveloppez-le dans un conteneur avec un BoxDecoration avec les accessoires border / borderRadius appropriés comme suit: Container( decoration: BoxDecoration( borderRadius: BorderRadius.circular(3.0), border: Border.all(color: Colors.grey[300])), child: ClipRRect( borderRadius: BorderRadius.circular(3.0), child: Image.network( uri, fit: BoxFit.fill, width: imageDimension, height: imageDimension, ), ), )
Daniel Allen
1
merci, un conseil: fonctionne uniquement avec une même largeur et hauteur
Álvaro Agüero
50

Vous pouvez également utiliser CircleAvatar, qui vient avec scintillement

CircleAvatar(
  radius: 20,
  backgroundImage: NetworkImage('https://via.placeholder.com/140x100')
)
onmyway133
la source
2
C'est la meilleure réponse. J'ai fait extrabackgroundImage: member[index].picture == null ? Image(image: AssetImage('assests/no-image.png')) : NetworkImage( member[index].picture,
saviour123
@ saviour123 toutes les images aux coins arrondis ne sont pas un «avatar». La réponse générique est acceptée.
nipunasudha
Impossible de définir une hauteur ou une largeur avec ce widget, ce qui pose problème.
papillon le
38

En utilisant, ClipRRectvous devez coder en dur BorderRadius, donc si vous avez besoin de trucs circulaires complets, utilisez ClipOvalplutôt.

ClipOval(
  child: Image.network(
    "image_url",
    height: 100,
    width: 100,
    fit: BoxFit.cover,
  ),
),
CopsOnRoad
la source
2
La réponse la plus simple!
Alvin Konda le
1
si l'image enfant n'est pas carrée, le découpage sera elliptique dans cette solution.
Bilal Şimşek
29

Essayez plutôt ceci, a fonctionné pour moi:

Container(
  width: 100.0,
  height: 150.0,
  decoration: BoxDecoration(
    image: DecorationImage(
        fit: BoxFit.cover, image: NetworkImage('Path to your image')),
    borderRadius: BorderRadius.all(Radius.circular(8.0)),
    color: Colors.redAccent,
  ),
),
Faisal Kc
la source
Votre réponse est vraiment utile, merci! Mais que se passe-t-il si le contenu d'un conteneur n'est pas seulement une image mais un widget? Une idée?
Oleksandr
13
   Container(
      width: 48.0,
      height: 48.0,
      decoration: new BoxDecoration(
        shape: BoxShape.circle,
        image: new DecorationImage(
            fit: BoxFit.fill,
            image: NetworkImage("path to your image")
        )
    )),
Simhachalam
la source
5

Pour l'image, utilisez ceci

ClipOval(
    child: Image.network(
        'https://url to your image',
        fit: BoxFit.fill,
    ),
);

Alors que pour Asset Image, utilisez ceci

ClipOval(
    child: Image.asset(
        'Path to your image',
        fit: BoxFit.cover,
    ),
)
Je sais ben
la source
1
J'ai déjà utilisé ceci comme réponse, vous n'avez rien fourni d'utile. -1 de moi.
CopsOnRoad
4

Avec la nouvelle version du flutter et du thème matériel, vous devez également utiliser le widget "Padding" pour avoir une image qui ne remplit pas son conteneur.

Par exemple, si vous souhaitez insérer une image arrondie dans l'AppBar, vous devez utiliser un remplissage ou votre image sera toujours aussi haute que l'AppBar.

J'espère que cela aidera quelqu'un

InkWell(
        onTap: () {
            print ('Click Profile Pic');
        },
        child: Padding(
            padding: const EdgeInsets.all(8.0),
            child: ClipOval(
                child: Image.asset(
                    'assets/images/profile1.jpg',
                ),
            ),
        ),
    ),
Patrick Gharapetians Gheshlagh
la source
3

vous pouvez utiliser ClipRRect comme ceci:

  Padding(
                  padding: const EdgeInsets.all(8.0),
                  child: ClipRRect(
                    borderRadius: BorderRadius.circular(25),
                    child: Image.asset(
                      'assets/images/pic13.jpeg',
                      fit: BoxFit.cover,
                    ),
                  ),
                )

vous pouvez définir votre rayon, ou l'utilisateur pour uniquement pour topLeft ou en bas à gauche comme:

Padding(
              padding: const EdgeInsets.all(8.0),
              child: ClipRRect(
                borderRadius: BorderRadius.only(
                    topLeft: Radius.circular(25)
                ,bottomLeft: Radius.circular(25)),
                child: Image.asset(
                  'assets/images/pic13.jpeg',
                  fit: BoxFit.cover,
                ),
              ),
            )
sana ebadi
la source
2

Utilisez ClipRRect avec la propriété d'image définie de fit: BoxFit.fill

ClipRRect(
          borderRadius: new BorderRadius.circular(10.0),
          child: Image(
            fit: BoxFit.fill,
            image: AssetImage('images/image.png'),
            width: 100.0,
            height: 100.0,
          ),
        ),
Yogesh Alai
la source
1

Utilisez ClipRRect, cela résoudra votre problème.

      ClipRRect(
              borderRadius: BorderRadius.all(Radius.circular(10.0)),
              child: Image.network(
                Constant.SERVER_LINK + model.userProfilePic,
                fit: BoxFit.cover,
              ),
            ),
Paras Sharma
la source
0

Utilisez cette méthode dans ce cercle, l'image fonctionne également + vous avez également un préchargeur pour l'image réseau:

new ClipRRect(
     borderRadius: new BorderRadius.circular(30.0),
     child: FadeInImage.assetNetwork(
          placeholder:'asset/loader.gif',
          image: 'Your Image Path',
      ),
    )
Ajit Singh
la source
0

Essayez ceci, cela fonctionne bien.

Container(
  height: 220.0,
  width: double.infinity,
  decoration: BoxDecoration(
    borderRadius: new BorderRadius.only(
      topLeft: Radius.circular(10),
       topRight: Radius.circular(10),
    ),
    image: DecorationImage(
      fit: BoxFit.fill,
      image: NetworkImage(
        photoUrl,
      ),
     ),
   ),
);
terap30
la source
-1

décoration utilisateur Image pour un conteneur.

  @override
  Widget build(BuildContext context) {
    final alucard = Container(
        decoration: new BoxDecoration(
        borderRadius: BorderRadius.circular(10),
          image: new DecorationImage(
              image: new AssetImage("images/logo.png"),
              fit: BoxFit.fill,
          )
        )
    );
SR Keshav
la source