How to do Rounded Corners Image in Flutter - flutter

I am using Flutter to make a list of information about movies. Now I want the cover image on the left to be a rounded corners picture. I did the following, but it didn’t work. Thanks!
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,
);
}
as follows

Use ClipRRect it will work perfectly.
ClipRRect(
borderRadius: BorderRadius.circular(8.0),
child: Image.network(
subject['images']['large'],
height: 150.0,
width: 100.0,
),
)

1. Circular image (without border)
Using CircleAvatar:
CircleAvatar(
radius: 48, // Image radius
backgroundImage: NetworkImage('imageUrl'),
)
Using ClipRRect:
ClipOval(
child: SizedBox.fromSize(
size: Size.fromRadius(48), // Image radius
child: Image.network('imageUrl', fit: BoxFit.cover),
),
)
2. Circular image (with border)
Using CircleAvatar:
CircleAvatar(
radius: 56,
backgroundColor: Colors.red,
child: Padding(
padding: const EdgeInsets.all(8), // Border radius
child: ClipOval(child: Image.network('imageUrl')),
),
)
Using ClipRRect:
Container(
padding: EdgeInsets.all(8), // Border width
decoration: BoxDecoration(color: Colors.red, shape: BoxShape.circle),
child: ClipOval(
child: SizedBox.fromSize(
size: Size.fromRadius(48), // Image radius
child: Image.network('imageUrl', fit: BoxFit.cover),
),
),
)
3. Rounded image (without border)
ClipRRect(
borderRadius: BorderRadius.circular(20), // Image border
child: SizedBox.fromSize(
size: Size.fromRadius(48), // Image radius
child: Image.network('imageUrl', fit: BoxFit.cover),
),
)
4. Rounded image (with border)
final borderRadius = BorderRadius.circular(20); // Image border
Container(
padding: EdgeInsets.all(8), // Border width
decoration: BoxDecoration(color: Colors.red, borderRadius: borderRadius),
child: ClipRRect(
borderRadius: borderRadius,
child: SizedBox.fromSize(
size: Size.fromRadius(48), // Image radius
child: Image.network('imageUrl', fit: BoxFit.cover),
),
),
)
There are other ways, like using DecoratedBox but that would make the answer bit too long.

You can also use CircleAvatar, which comes with flutter
CircleAvatar(
radius: 20,
backgroundImage: NetworkImage('https://via.placeholder.com/140x100')
)

Try this instead, worked for me:
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,
),
),

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")
)
)),

Try this, with CircleAvatar and load image with CachedNetworkImage.
CircleAvatar(
radius: 45,
child: ClipOval(
child: CachedNetworkImage(
imageUrl: "https:// your image url path",
fit: BoxFit.cover,
width: 80,
height: 80,
),
),
),
if you want border also, then add
backgroundColor: Colors.deepOrangeAccent,
inside this
CircleAvatar(
radius: 45,
backgroundColor: Colors.deepOrangeAccent,
child: ClipOval(
child: CachedNetworkImage(
imageUrl: "https:// your image url path",
fit: BoxFit.cover,
width: 80,
height: 80,
),
),
),

For image use this
ClipOval(
child: Image.network(
'https://url to your image',
fit: BoxFit.fill,
),
);
While for Asset Image use this
ClipOval(
child: Image.asset(
'Path to your image',
fit: BoxFit.cover,
),
)

This is the code that I have used.
Container(
width: 200.0,
height: 200.0,
decoration: BoxDecoration(
image: DecorationImage(image: NetworkImage('Network_Image_Link')),
color: Colors.blue,
borderRadius: BorderRadius.all(Radius.circular(25.0)),
),
),
Thank you!!!

you can use ClipRRect like this :
Padding(
padding: const EdgeInsets.all(8.0),
child: ClipRRect(
borderRadius: BorderRadius.circular(25),
child: Image.asset(
'assets/images/pic13.jpeg',
fit: BoxFit.cover,
),
),
)
you can set your radius, or user for only for topLeft or bottom left like :
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,
),
),
)

With new version of flutter and material theme u need to use the "Padding" widgett too in order to have an image that doesn't fill its container.
For example if you want to insert a rounded image in the AppBar u must use padding or your image will always be as high as the AppBar.
Hope this will help someone
InkWell(
onTap: () {
print ('Click Profile Pic');
},
child: Padding(
padding: const EdgeInsets.all(8.0),
child: ClipOval(
child: Image.asset(
'assets/images/profile1.jpg',
),
),
),
),

Use ClipRRect with set image property of 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,
),
),

Use ClipRRect it will resolve your problem.
ClipRRect(
borderRadius: BorderRadius.all(Radius.circular(10.0)),
child: Image.network(
Constant.SERVER_LINK + model.userProfilePic,
fit: BoxFit.cover,
),
),

Output:
Using BoxDecoration
Container(
margin: EdgeInsets.all(8),
width: 86,
height: 86,
decoration: BoxDecoration(
shape: BoxShape.circle,
image: DecorationImage(
image: NetworkImage('https://i.stack.imgur.com/0VpX0.png'),
fit: BoxFit.cover
),
),
),

Use this Way in this circle image is also working + you have preloader also for network image:
new ClipRRect(
borderRadius: new BorderRadius.circular(30.0),
child: FadeInImage.assetNetwork(
placeholder:'asset/loader.gif',
image: 'Your Image Path',
),
)

Try This it works well.
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,
),
),
),
);

user decoration Image for a container.
#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,
)
)
);

Image all side rounder corner try this one
Container(
// height and width depend on your your requirement.
height: 220.0,
width: double.infinity,
decoration: BoxDecoration(
// radius circular depend on your requirement
borderRadius: new BorderRadius.all(
Radius.circular(10),
),
image: DecorationImage(
fit: BoxFit.fill,
// image url your network image url
image: NetworkImage(
"dynamic image url",
),
),
),
);

For Circular Image in Flutter
ClipRRect(
child: Image.asset(
"assets/images/ic_cat.png",
width: 80,
height: 80,
),
borderRadius: BorderRadius.circular(50),
))
If U want only corners of image then simple change the BorderRadius.circular like below
ClipRRect(
child: Image.asset(
"assets/images/ic_cat.png",
width: 80,
height: 80,
),
borderRadius: BorderRadius.circular(20),
))

Related

BoxFit.cover in ClipRRect in Hero in Container Stack doesn't fill container

I try to center the image in the Container. I tried to adjust the fit property but it doesn't seem to work. What can I try next?
Stack(
children: <Widget>[
Container(
height: MediaQuery.of(context).size.width,
decoration: BoxDecoration(
borderRadius: BorderRadius.circular(30.0),
boxShadow: [
BoxShadow(
color: Colors.black26,
offset: Offset(0.0, 2.0),
blurRadius: 6.0,
),
],
),
child: Hero(
tag: widget.destination.imageUrl,
child: ClipRRect(
borderRadius: BorderRadius.circular(30.0),
child: Image(
image: NetworkImage(widget.destination.imageUrl),
fit: BoxFit.cover,
),
),
),
),
Try setting width to double.infinity in Image Widget
child: Hero(
tag: widget.destination.imageUrl,
child: ClipRRect(
borderRadius: BorderRadius.circular(30.0),
child: const Image(
width: double.infinity, //TODO: Set width to double.infinity
image: NetworkImage(
widget.destination.imageUrl),
fit: BoxFit.cover,
),
),
),

Boxdecoration fit parent height

I need to make a container with background image and background color in the bottom 30 pixels, but I need the layout to look like this:
SizedBox(
height: 540,
child: Container(
width: 392.7,
height: 510,
alignment: Alignment.center,
decoration: BoxDecoration(
color: Colors.grey[300],
borderRadius: BorderRadius.only(
bottomLeft: Radius.circular(25),
bottomRight: Radius.circular(25)),
image: DecorationImage(
image: Image.network(
'https://ak.picdn.net/shutterstock/videos/8258557/thumb/1.jpg',
).image,
fit: BoxFit.cover)
as per your ui I think u have to use stack instead of column use stack and it will provide your desire output
Here is code example:-
SizedBox(
height: 540,
child: Stack(
children: [
Container(
decoration: BoxDecoration(
image: DecorationImage(
image:
/// your image
fit: BoxFit.fill,
)),
),
Positioned(
bottom: 0.0,
child: Container(
height: 30,
// set color and border radius as u need
)),
],
),
);
You can simply use Column to and use another Container or Material... widget to provide extra 30px border.
SizedBox(
height: 540,
child: Column(
children: [
Container(
width: 392.7,
height: 510,
alignment: Alignment.center,
decoration: BoxDecoration(
color: Colors.grey[300],
borderRadius: const BorderRadius.only(
bottomLeft: Radius.circular(25),
bottomRight: Radius.circular(25)),
image: DecorationImage(
image: Image.network(
'https://ak.picdn.net/shutterstock/videos/8258557/thumb/1.jpg',
).image,
fit: BoxFit.cover),
),
),
Container(
color: Colors.deepPurple,
height: 30.0,
width: 392.7,
)
],
),
)
But For background cases you can use Stack for it.
SizedBox(
height: 540,
width: 392.7,
child: Stack(
children: [
Container(
color: Colors.deepPurple,
),
Container(
width: 392.7,
height: 510,
alignment: Alignment.center,
decoration: BoxDecoration(
color: Colors.grey[300],
borderRadius: const BorderRadius.only(
bottomLeft: Radius.circular(25),
bottomRight: Radius.circular(25)),
image: DecorationImage(
image: Image.network(
'https://ak.picdn.net/shutterstock/videos/8258557/thumb/1.jpg',
).image,
fit: BoxFit.cover),
),
),
],
),
)
More about Stack
Try this code below and let me know if change required.
SizedBox(
height: 540,
child: Column(
children: [
Expanded(
child: Container(
decoration: BoxDecoration(
image: DecorationImage(
image: NetworkImage(
"https://cdn.pixabay.com/photo/2015/04/23/22/00/tree-736885__480.jpg",
),
fit: BoxFit.fill,
)),
)),
Container(
height: 30,
color: Colors.red,
)
],
),
)

Flutter problem with layout Stack Widget, space between the top of two child widgets

I want to have a pop-up card which has a picture with opacity as background. Therefor I used Material with white background and put the picture on top. But this leads to a thin white "border-line" at the top of the pop-up card.
Update
Found out it's not a white line...it's the background-image...
So the container "in front" isn't positioned 100% at the top of the stack... but I don't know why and how to fix...
Here is my code:
...
return Center(
child: Material(
color: Colors.white,
borderRadius:BorderRadius.circular(15),
elevation: 10,
child: Stack(
children:[
Container(
width: 904,
height: 500,
decoration: BoxDecoration(
shape: BoxShape.rectangle,
borderRadius: BorderRadius.circular(15),
image: DecorationImage(
image: AssetImage('assets/images/xyz.png'),
fit: BoxFit.cover,
colorFilter:ColorFilter.mode(Colors.white.withOpacity(0.4), BlendMode.dstATop), ),
),
child: SingleChildScrollView(
child: Padding(
padding: const EdgeInsets.only(right:365 , left: 650,),
child: Column(
mainAxisSize: MainAxisSize.min,
children: [
//ToDo
],
),
),
),
),
Container(
height:86 ,
width: 904,
decoration: BoxDecoration(
shape: BoxShape.rectangle,
borderRadius: BorderRadius.only(topLeft: Radius.circular(15),topRight: Radius.circular(15)),
image: DecorationImage(
image: AssetImage('assets/images/xyz.png'),
fit: BoxFit.cover,
),
),
),
]
),
),
);
Any ideas how to fix this?
Not the answer I where looking for...but I solved it with this:
return Center(
child: Material(
color: Colors.transparent,
borderRadius:BorderRadius.circular(15),
elevation: 10,
child: SizedBox(
height: 500,
child: Column(
children:[
Container(
height:86 ,
width: 904,
decoration: BoxDecoration(
shape: BoxShape.rectangle,
borderRadius: BorderRadius.only(topLeft: Radius.circular(15),topRight: Radius.circular(15)),
image: DecorationImage(
image: AssetImage('assets/images/xyz.png'),
fit: BoxFit.cover,
),
),
),
Stack(
children: [
Container(
width: 904,
height: 500-86,
decoration: BoxDecoration(
color: Colors.white,
shape: BoxShape.rectangle,
borderRadius: BorderRadius.only(bottomRight: Radius.circular(15), bottomLeft: Radius.circular(15)),//circular(15),
),
),
Container(
width: 904,
height: 500-86,
decoration: BoxDecoration(
shape: BoxShape.rectangle,
borderRadius: BorderRadius.only(bottomRight: Radius.circular(15), bottomLeft: Radius.circular(15)),//circular(15),
image: DecorationImage(
image: AssetImage('assets/images/xyz.png'),
fit: BoxFit.cover,
colorFilter:ColorFilter.mode(Colors.white.withOpacity(0.4), BlendMode.dstATop),
),
),
child: SingleChildScrollView(
child: Padding(
padding: const EdgeInsets.only(right:365 , left: 650,),
child: Column(
mainAxisSize: MainAxisSize.min,
children: [
//ToDo
],
),
),
),
),
],
)
]
),
),
),
);
If anyone knows the answer why there is a gap between the two containers in the stack, please post your answer.

Confused about BorderRadius

I am trying to make a shopping card layout How can I make grey container rounded from top-right and top left.This what I have done so far .What I am i doing wrong Any help will be appreciated
Scrrenshot
Container(
width: ScreenUtil().screenWidth,
height: ScreenUtil().screenHeight,
color: Colors.black12,
child: Stack(
children: [
Container(
width: 500,
height: 400,
decoration: BoxDecoration(
color:Colors.red,
image: DecorationImage(
image: AssetImage("assets/images/x.jpg"),
fit: BoxFit.cover),
),
),
Positioned(
top: 300,
left: 50,
right: 50,
child: Container(
decoration: BoxDecoration(
color: Colors.red,
borderRadius: BorderRadius.only(
topLeft: Radius.circular(20),
topRight: Radius.circular(20),
),
),
padding: EdgeInsets.symmetric(horizontal: 130),
width: 400,
child: Column(
children: [],
),
),
),
],
),
),
Seems like you forgot to give a height to the second container. Border radius is working fine when you give the container a height.

Flutter image does not fit in

Container(
width:
MediaQuery.of(context).size.width / 4.4,
height:
MediaQuery.of(context).size.height / 10,
decoration: BoxDecoration(
border: Border.all(
color: Colors.black12,
width: 1.5,
style: BorderStyle.solid),
borderRadius:
BorderRadius.all(Radius.circular(20)),
),
child: (TmpBytesImage == null)
? Icon(Icons.camera_alt,
color: Colors.black26)
: Image.memory(TmpBytesImage,
fit: BoxFit.fill),
),
I expected was to fill Container with images.
but image looks like ignore BoxDecoration
How to get image to look like this Container?
Simply use Card, give it shape and put your Container inside it. Simple example:
Card(
elevation: 12,
shape: RoundedRectangleBorder(
borderRadius: BorderRadius.all(Radius.circular(20)),
),
child: ClipRRect(
borderRadius: BorderRadius.all(Radius.circular(20)),
child: Container(
padding: EdgeInsets.all(20),
width: MediaQuery.of(context).size.width / 2,
height: MediaQuery.of(context).size.height / 4,
child: Image.asset(
chocolateImage,
fit: BoxFit.fill,
),
),
),
),
try to add the image inside the container decoration
like this
decoration: BoxDecoration(
image: DecorationImage(
image:
AssetImage('assets/image.jpg'),
fit: BoxFit.cover,
),