如何在 NetworkImage() 加载之前显示本地图像?
How to Show an Local image till the NetworkImage() Loads Up in flutter?
new CircleAvatar(
backgroundColor: Colors.black87,
backgroundImage: new NetworkImage(url),
radius: 45.0,
)
我想在 CircleAvatar
中显示本地图像,直到 NetworkImage
从 Internet 完全加载。
使用 StateflWidget
并且您可以将 listener
添加到 ImageStream
并覆盖 initState
以触发本地图像与从中获取的图像之间的替换满载时上网。
我使用了高分辨率图片来显示加载时间:
var _loadImage = new AssetImage(
'assets/img/basic2-090_loader_loading-512.png');
var _myEarth = new NetworkImage(
"http://qige87.com/data/out/73/wp-image-144183272.png");
bool _checkLoaded = true;
@override
void initState() {
_myEarth.resolve(new ImageConfiguration()).addListener((_, __) {
if (mounted) {
setState(() {
_checkLoaded = false;
});
}
});
}
@override
Widget build(BuildContext context) {
return new Scaffold(
body: new Center(child: new Container(
decoration: new BoxDecoration(shape: BoxShape.circle,),
height: 80.0,
width: 80.0,
child: new CircleAvatar(
backgroundColor: Theme
.of(context)
.scaffoldBackgroundColor,
backgroundImage: _checkLoaded ? _loadImage : _myEarth,
),)
)
);
}
}
加载大图像时,显示后备资源!
new PlutoImage.networkWithPlaceholder("http://68.media.tumblr.com/f7e2e01128ca8eb2b9436aa3eb2a0a33/tumblr_ogwlnpSpcU1sikc68o1_1280.png", new Image.asset("assets/placeholder.png"));
您可能想尝试 FadeInImage
wrapped in a ClipOval
。 FadeInImage
提供了一个 placeholder
属性 您可以在网络图像加载时使用。
注意:ClipOval
如果你经常这样做,可能会很昂贵,所以请谨慎使用。
现在有一个新的官方小部件!
首先,在项目根目录中创建一个名为assets
的文件夹。
然后,提到pubspec.yaml
文件中的文件夹(也可以在项目根目录中找到):
flutter:
uses-material-design: true
assets:
- assets/
你可以把图片放在那里,比如把这个放成./assets/loading.gif
。
(如果您更改了 assets 文件夹中的文件,热重载将不起作用。请确保您完全重新启动应用程序。)
现在可以参考代码中的加载文件了:
FadeInImage.assetNetwork(
placeholder: 'assets/loading.gif',
image: 'https://github.com/flutter/website/blob/master/src/_includes/code/layout/lakes/images/lake.jpg?raw=true',
);
更多详情:https://flutter.io/docs/cookbook/images/fading-in-images#from-asset-bundle
我开发了一个名为 flutter_url_image_load_fail 的包来定义 loading 和 failed to load 小部件:
LoadImageFromUrl(
'https://upload.wikimedia.org/wikipedia/commons/1/17/Google-flutter-logo.png', //Image URL to load
(image) => image, //What widget returns when the image is loaded successfully
() => Text('Loading...'), //What widget returns when the image is loading
(IRetryLoadImage retryLoadImage, code , message){ //What widget returns when the image failed to load
return RaisedButton(
child: Text('Try Again'),
onPressed: (){
retryLoadImage.retryLoadImage(); //Call this method to retry load the image when it failed to load
},
);
},
requestTimeout: Duration(seconds: 5) //Optionally set the timeout
)
有一个新的 cached_network_image
包,其中包含一个 "loading" 和一个 "error" 图像。随着自动图像缓存。
您可以将任何您想要的设置为占位符,例如从您的资产中使用 Image.asset('assets/images/my_placeholder.png')
解决问题的两种方法
1) 使用Image.network : 如果你想在图片加载时显示进度条、simmer 或任何其他小部件。
Image.network(
"URL",
fit: BoxFit.cover,
loadingBuilder: (BuildContext ctx, Widget child, ImageChunkEvent loadingProgress) {
if (loadingProgress == null) {
return child;
}else {
return Center(
child: CircularProgressIndicator(
valueColor: AlwaysStoppedAnimation<Color>(Colors.green),
),
);
}
},
)
2) 使用FadeInImage : 如果你想在网络图片加载时显示你的本地图片
FadeInImage.assetNetwork(
image:"URL",
placeholder:"assets/loading.png" // your assets image path
fit: BoxFit.cover,
)
您可以使用 FadeInImage.
使用资产中的占位符
FadeInImage.assetNetwork(
placeholder: "assets/images/image1.png",
image:"URL"
),
使用记忆中的占位符
FadeInImage.memoryNetwork(
placeholder: localImageBytes,
image:"URL"
),
您也可以使用frameBuilder
属性。好处:您可以在此处实现自定义占位符小部件。
Image.network('https://example.com/my-image',
height: 100,
frameBuilder: (context, child, frame, _) {
if (frame == null) {
// fallback to placeholder
return MyPlaceholderWidget();
}
return child;
}
)
要做到这一点,您可以使用 Cached network image 包。 CachedNetworkImage可以直接使用,也可以通过ImageProvider
像这样创建一个 CircleAvatar
CircleAvatar(
radius: 50,
foregroundColor: Colors.transparent,
backgroundColor: appThemeColor.shade50,
child: CachedNetworkImage(
imageUrl: UserInfoData.instance.getUserImageUrl(),
placeholder: (context, url) => CupertinoActivityIndicator(),
imageBuilder: (context, image) => CircleAvatar(
backgroundImage: image,
radius: 40,
),
errorWidget: (context, url, error) => CircleAvatar(
backgroundColor: Colors.grey,
child: userProfileAvatarPlaceholder,
radius: 40,
),
),
),
new CircleAvatar(
backgroundColor: Colors.black87,
backgroundImage: new NetworkImage(url),
radius: 45.0,
)
我想在 CircleAvatar
中显示本地图像,直到 NetworkImage
从 Internet 完全加载。
使用 StateflWidget
并且您可以将 listener
添加到 ImageStream
并覆盖 initState
以触发本地图像与从中获取的图像之间的替换满载时上网。
我使用了高分辨率图片来显示加载时间:
var _loadImage = new AssetImage(
'assets/img/basic2-090_loader_loading-512.png');
var _myEarth = new NetworkImage(
"http://qige87.com/data/out/73/wp-image-144183272.png");
bool _checkLoaded = true;
@override
void initState() {
_myEarth.resolve(new ImageConfiguration()).addListener((_, __) {
if (mounted) {
setState(() {
_checkLoaded = false;
});
}
});
}
@override
Widget build(BuildContext context) {
return new Scaffold(
body: new Center(child: new Container(
decoration: new BoxDecoration(shape: BoxShape.circle,),
height: 80.0,
width: 80.0,
child: new CircleAvatar(
backgroundColor: Theme
.of(context)
.scaffoldBackgroundColor,
backgroundImage: _checkLoaded ? _loadImage : _myEarth,
),)
)
);
}
}
加载大图像时,显示后备资源!
new PlutoImage.networkWithPlaceholder("http://68.media.tumblr.com/f7e2e01128ca8eb2b9436aa3eb2a0a33/tumblr_ogwlnpSpcU1sikc68o1_1280.png", new Image.asset("assets/placeholder.png"));
您可能想尝试 FadeInImage
wrapped in a ClipOval
。 FadeInImage
提供了一个 placeholder
属性 您可以在网络图像加载时使用。
注意:ClipOval
如果你经常这样做,可能会很昂贵,所以请谨慎使用。
现在有一个新的官方小部件!
首先,在项目根目录中创建一个名为assets
的文件夹。
然后,提到pubspec.yaml
文件中的文件夹(也可以在项目根目录中找到):
flutter:
uses-material-design: true
assets:
- assets/
你可以把图片放在那里,比如把这个放成./assets/loading.gif
。
(如果您更改了 assets 文件夹中的文件,热重载将不起作用。请确保您完全重新启动应用程序。)
现在可以参考代码中的加载文件了:
FadeInImage.assetNetwork(
placeholder: 'assets/loading.gif',
image: 'https://github.com/flutter/website/blob/master/src/_includes/code/layout/lakes/images/lake.jpg?raw=true',
);
更多详情:https://flutter.io/docs/cookbook/images/fading-in-images#from-asset-bundle
我开发了一个名为 flutter_url_image_load_fail 的包来定义 loading 和 failed to load 小部件:
LoadImageFromUrl(
'https://upload.wikimedia.org/wikipedia/commons/1/17/Google-flutter-logo.png', //Image URL to load
(image) => image, //What widget returns when the image is loaded successfully
() => Text('Loading...'), //What widget returns when the image is loading
(IRetryLoadImage retryLoadImage, code , message){ //What widget returns when the image failed to load
return RaisedButton(
child: Text('Try Again'),
onPressed: (){
retryLoadImage.retryLoadImage(); //Call this method to retry load the image when it failed to load
},
);
},
requestTimeout: Duration(seconds: 5) //Optionally set the timeout
)
有一个新的 cached_network_image
包,其中包含一个 "loading" 和一个 "error" 图像。随着自动图像缓存。
您可以将任何您想要的设置为占位符,例如从您的资产中使用 Image.asset('assets/images/my_placeholder.png')
解决问题的两种方法
1) 使用Image.network : 如果你想在图片加载时显示进度条、simmer 或任何其他小部件。
Image.network(
"URL",
fit: BoxFit.cover,
loadingBuilder: (BuildContext ctx, Widget child, ImageChunkEvent loadingProgress) {
if (loadingProgress == null) {
return child;
}else {
return Center(
child: CircularProgressIndicator(
valueColor: AlwaysStoppedAnimation<Color>(Colors.green),
),
);
}
},
)
2) 使用FadeInImage : 如果你想在网络图片加载时显示你的本地图片
FadeInImage.assetNetwork(
image:"URL",
placeholder:"assets/loading.png" // your assets image path
fit: BoxFit.cover,
)
您可以使用 FadeInImage.
使用资产中的占位符
FadeInImage.assetNetwork(
placeholder: "assets/images/image1.png",
image:"URL"
),
使用记忆中的占位符
FadeInImage.memoryNetwork(
placeholder: localImageBytes,
image:"URL"
),
您也可以使用frameBuilder
属性。好处:您可以在此处实现自定义占位符小部件。
Image.network('https://example.com/my-image',
height: 100,
frameBuilder: (context, child, frame, _) {
if (frame == null) {
// fallback to placeholder
return MyPlaceholderWidget();
}
return child;
}
)
要做到这一点,您可以使用 Cached network image 包。 CachedNetworkImage可以直接使用,也可以通过ImageProvider
像这样创建一个 CircleAvatar
CircleAvatar(
radius: 50,
foregroundColor: Colors.transparent,
backgroundColor: appThemeColor.shade50,
child: CachedNetworkImage(
imageUrl: UserInfoData.instance.getUserImageUrl(),
placeholder: (context, url) => CupertinoActivityIndicator(),
imageBuilder: (context, image) => CircleAvatar(
backgroundImage: image,
radius: 40,
),
errorWidget: (context, url, error) => CircleAvatar(
backgroundColor: Colors.grey,
child: userProfileAvatarPlaceholder,
radius: 40,
),
),
),