Hero Animation for Network Image in Flutter - flutter

I am trying to add Hero animation for a Network Image.
The problem is, when I navigate from one screen to another the image loads again on second screen and so I am not able to see the animation.
After loading complete, if I repeat this navigation (from 1st screen to 2nd) this is working fine.
So the question is, How can I achieve this animation when I navigate for first time?
Error-Output:
Click Here
Code:
FirstScreen.dart
Hero(
tag: 'tag',
child: Image.network(
'https://...',
cacheHeight: 1080,
cacheWidth: 1080,
fit: BoxFit.none,
scale: 5,
),
),
secondScreen.dart
Hero(
tag: 'tag',
child: Image.network(
'https://...',
),
)
With CachedNetworkImage:
firstScreen.dart
Hero(
tag: tag
child: CachedNetworkImage(
imageUrl: 'url',
fit: BoxFit.scaleDown,
height: 200,
width: 200,
memCacheHeight: 1080,
memCacheWidth: 1080,
errorWidget: (context, url, error) => Image.asset('assets/..'),
),
)
secondScreen.dart
Hero(
tag: tag,
child: CachedNetworkImage(
imageUrl: 'url',
errorWidget: (context, url, error) => Image.asset('assets/...'),
),
),

create loading builder in the network image widget and use a placeholder instead of image when the image is not fully loaded something like this
Image.network(
imagePath,
// width: 100,
// height: 100,
loadingBuilder: (BuildContext context,
Widget child,
ImageChunkEvent? loadingProgress) {
if (loadingProgress == null) return child;
return Container(
width: 100,
height: 100,
child: Center(
child: // PlaceHolderWidget()
),
);
},
// fit: BoxFit.none,
)

Related

Photo_view flutter photo wont show

My app was able to attach some picture and show it. I want the user to be able to see the image picture in full size so I'm trying to use photo_view but I'm not getting the result what I want. I used gesture detector to trigger the app so the image will open on tap. How can I achieve that?
error: The argument type #NetworkImage or CachedNetworkImage# can't be assigned to the parameter type 'ImageProvider?'. (argument_type_not_assignable at [tiket_kerja] lib\screens\main_pages\main_detail_ticket_page.dart:2785)
Here's my code:
GestureDetector(
child: CachedNetworkImage(
imageUrl: ticketData[
'picture_attachment_map']
[
'image_${index + 1}'],
height: 150.h,
fit: BoxFit.cover,
),
onTap: () {
print('Imaged clicked');
PhotoView(
imageProvider: CachedNetworkImage(
imageUrl: ticketData[
'picture_attachment_map']
[
'image_${index + 1}'],
height: 150.h,
fit: BoxFit.cover,
),
);
},
),
As Error can't be assigned to the parameter type 'ImageProvider It seems you have to use ImageProvider. In this case you have to replace CachedNetworkImage with CachedNetworkImageProvider
So your code should be like
GestureDetector(
child: CachedNetworkImage(
imageUrl: ticketData[
'picture_attachment_map']
[
'image_${index + 1}'],
height: 150.h,
fit: BoxFit.cover,
),
onTap: () {
print('Imaged clicked');
PhotoView(
imageProvider: CachedNetworkImageProvider(
imageUrl: ticketData[
'picture_attachment_map']
[
'image_${index + 1}'],
height: 150.h,
fit: BoxFit.cover,
),
);
},
),

make photo bigger when click on flutter

how to make the picture zoomable when the photo is clicked, here's the code I made to display the image
Column(
children: [
image11 != null
? Image.file(
image11,
width: 50,
height: 50,
fit: BoxFit.cover,
)
: Text(" Bagian Belakang"),
Container(
margin: const EdgeInsets.fromLTRB(14, 5, 0, 0),
child: RaisedButton(
padding: EdgeInsets.all(10),
onPressed: () {
pickImage11(ImageSource.camera);
},
child: Icon(Icons.camera),
),
),
],
),
Taking inspiration from this answer Hero animation with an AlertDialog
You can use a Hero widget combined with a PageRouteBuilder to imitate a zoom feature:
Navigator.of(context).push(
PageRouteBuilder(
opaque: false,
barrierDismissible:true,
pageBuilder: (BuildContext context, _, __) {
return Hero(
tag: "zoom",
child: Image.file(...),
);
}
)
);
EDIT: I found barrier dismissable not working and found the solution here: Flutter SizeTransition and PageRouteBuilder not working
You will have to wrap the Hero widget with a defined width and height to get the optimum zoom level.

How to stretch image to the screen borders by width?

I need to show image with a width of a screen, but when the image is smaller it does not strech to the screen edges.
CachedNetworkImage _getImage(String link, BuildContext context) {
return CachedNetworkImage(
width: MediaQuery.of(context).size.width,
imageUrl: link,
placeholder: (context, url) => Center(child: CircularProgressIndicator()),
errorWidget: (context, url, error) => Icon(Icons.error),
);
}
and width: MediaQuery.of(context).size.width, - does not stretch the image but just put it in the center of screen width
body: SingleChildScrollView(
child: Column(
// outer column
children: [
_getImage(imageLink, context),
...
try these two modifications:
CachedNetworkImage(
fit: BoxFit.fitWidth // or any other fitting option
),
and
Column(
crossAxisAlignment : CrossAxisAlignment.stretch,
// outer column
children: [
_getImage(imageLink, context),
...

Flutter: avoid opacity effect for FlexibleSpaceBar

I use a FlexibleSpaceBar but only for an image. The AppBar is always on top so there is no transition between these 2 elements at all, just the effect of scrolling the image up using parallax.
So I don't need to make the opacity effect for the image.
I know it's possible because I've seen it on Aliexpress's app, which I know it uses Flutter. You can see the no opacity effect here:
https://youtu.be/ESSsY2m7vTY?t=28
when mine is looking like this:
https://youtu.be/Jnm9jN4-wWY
This is my widget:
FlexibleSpaceBar(
collapseMode: CollapseMode.parallax,
background: Hero(
tag: widget.newRent == false
? 'rent-image${Provider.of<MyRents>(context).currenRentIndex}'
: 'new-rent-image',
child: _imageEdited == false
? myRent['images'].isNotEmpty
? CachedNetworkImage(
imageUrl: myRent['images'][0],
fit: BoxFit.cover,
placeholder: (context, url) =>
Center(child: CircularProgressIndicator()),
errorWidget: (context, url, error) =>
errorImage(context),
)
: Provider.of<MyRents>(context, listen: false)
.newGalleryImages
.isNotEmpty
? Image.file(
Provider.of<MyRents>(context, listen: false)
.newGalleryImages[0],
fit: BoxFit.cover)
: Container(
padding: const EdgeInsets.all(20.0),
child: Image(
image:
AssetImage('assets/images/icon.jpg'),
),
)
: Image.file(myRent['images'][0], fit: BoxFit.cover),
),
),
After removing all the checks it's a basic FlexibleSpaceBar with a Hero transition, nothing fancy
I think the problem is because it is indeed a "Bar" like the name of the widget says: FlexibleSpaceBar. You would have to propably extend this function and overwrite this behaviour or maybe you could use this:
https://pub.dev/packages/stretchy_header
Followed this approach:
https://stackoverflow.com/a/58973381/4858133
Stack(
children: <Widget>[
Positioned.fill(
child: Hero(
tag: widget.newRent == false
? 'rent-image${Provider.of<MyRents>(context).currenRentIndex}'
: 'new-rent-image',
child: _imageEdited == false
// TODO: move it to a separate function
? myRent['images'].isNotEmpty
? CachedNetworkImage(
imageUrl: myRent['images'][0],
fit: BoxFit.cover,
placeholder: (context, url) => Center(
child: CircularProgressIndicator()),
errorWidget: (context, url, error) =>
errorImage(context),
)
: Provider.of<MyRents>(context, listen: false)
.newGalleryImages
.isNotEmpty
? Image.file(
Provider.of<MyRents>(context,
listen: false)
.newGalleryImages[0],
fit: BoxFit.cover)
: Container(
padding: const EdgeInsets.all(20.0),
child: Image(
image: AssetImage(
'assets/images/icon.jpg'),
),
)
: Image.file(myRent['images'][0],
fit: BoxFit.cover),
),
),
],
),

FadeInImage in CircleAvatar

How can I have a fade in effect in CircleAvatar?
Type of backgroundImage of CircleAvatar is ImageProvider and FadeInImage is not a ImageProvider
Use Clip react,
for image loading i use CachedNetworkImage(cached_network_image: 2.3.3)
ClipRRect(
borderRadius: BorderRadius.circular(25.0),
child: CachedNetworkImage(
fit: BoxFit.cover,
width: 50,
height: 50,
placeholder: (context, url) => Image.asset('loadder.gif'),
imageUrl:
"https://encrypted-tbn0.gstatic.com/images?q=tbn%3AANd9GcRLe5PABjXc17cjIMOibECLM7ppDwMmiDg6Dw&usqp=CAU"),
),
this is user loader image or gif(example).
placeholder: (context, url) => Image.asset('loadder.gif'),
this is your main image(example).
imageUrl:"https://encrypted-tbn0.gstatic.com/images?q=tbn%3AANd9GcRLe5PABjXc17cjIMOibECLM7ppDwMmiDg6Dw&usqp=CAU"),