我是 Flutter 的新手。我尝试使用image.network
小部件加载网络图像。它工作正常,但有时加载需要时间。我在点击期间添加了点击侦听器,image.network
我需要根据需要重定向页面的结果检查图像是否已完全加载。如何检查图像是否加载?
代码:
new Image.network('http://via.placeholder.com/350x150')
任何帮助将不胜感激,在此先感谢您
我是 Flutter 的新手。我尝试使用image.network
小部件加载网络图像。它工作正常,但有时加载需要时间。我在点击期间添加了点击侦听器,image.network
我需要根据需要重定向页面的结果检查图像是否已完全加载。如何检查图像是否加载?
代码:
new Image.network('http://via.placeholder.com/350x150')
任何帮助将不胜感激,在此先感谢您
您可以使用loadingBuilder
颤振的内置功能Image.Network
我这样做如下:
Image.network(imageURL,fit: BoxFit.cover,
loadingBuilder:(BuildContext context, Widget child,ImageChunkEvent loadingProgress) {
if (loadingProgress == null) return child;
return Center(
child: CircularProgressIndicator(
value: loadingProgress.expectedTotalBytes != null ?
loadingProgress.cumulativeBytesLoaded / loadingProgress.expectedTotalBytes
: null,
),
);
},
),
对于此类问题,最好使用cached_network_image 以便在加载图像时提供占位符,并在资源加载失败时提供错误小部件
String url = "http://via.placeholder.com/350x150";
CachedNetworkImage(
imageUrl: url,
placeholder: (context,url) => CircularProgressIndicator(),
errorWidget: (context,url,error) => new Icon(Icons.error),
),
对于不需要缓存图像的人可以使用meet_network_image包,
包基本用法:
MeetNetworkImage(
imageUrl:
"https://random.dog/3f62f2c1-e0cb-4077-8cd9-1ca76bfe98d5.jpg",
loadingBuilder: (context) => Center(
child: CircularProgressIndicator(),
),
errorBuilder: (context, e) => Center(
child: Text('Error appear!'),
),
)
此外,您可以自己使用FutureBuilder
,
我们需要通过http调用获取数据,我们需要在导入之前导入http,您还需要添加pubspec.yaml
并运行命令flutter packages get
import 'package:http/http.dart' as http;
FutureBuilder(
// Paste your image URL inside the htt.get method as a parameter
future: http.get(
"https://random.dog/3f62f2c1-e0cb-4077-8cd9-1ca76bfe98d5.jpg"),
builder: (BuildContext context, AsyncSnapshot<http.Response> snapshot) {
switch (snapshot.connectionState) {
case ConnectionState.none:
return Text('Press button to start.');
case ConnectionState.active:
case ConnectionState.waiting:
return CircularProgressIndicator();
case ConnectionState.done:
if (snapshot.hasError)
return Text('Error: ${snapshot.error}');
// when we get the data from the http call, we give the bodyBytes to Image.memory for showing the image
return Image.memory(snapshot.data.bodyBytes);
}
return null; // unreachable
},
);
您可以使用带有占位符的FadeInImage来执行此操作
当使用默认的 Image 小部件显示图像时,您可能会注意到它们只是在加载时弹出到屏幕上。这可能会让您的用户在视觉上感到刺耳。
相反,首先显示一个占位符不是很好吗,并且图像在加载时会淡入淡出?将FadeInImage
小部件用于此目的。
FadeInImage适用于任何类型的图像:内存中、本地资产或来自 Internet 的图像。
您还可以考虑使用本地资产作为占位符。首先,将资产添加到项目的pubspec.yaml
文件中(有关更多详细信息,请参阅添加资产和图像):
完整示例
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
final title = 'Fade in images';
return MaterialApp(
title: title,
home: Scaffold(
appBar: AppBar(
title: Text(title),
),
body: Center(
child: FadeInImage.assetNetwork(
placeholder: 'assets/loading.gif',
image: 'https://picsum.photos/250?image=9',
),
),
),
);
}
}
感谢您的评论,这有助于解决如何知道图像是否已加载的情况希望有所帮助
我使用 StatefulWidget 需要编辑取决于您的 AffichScreen
情况 :
-i have an url that i enter
-if url is correct affich the image if not affich an icon
-if empty affich a Text()
-precacheImage check if the url is correct if not give an error and change _loadingimage(bool) to false to affich the icon eror
-i use a NetworkImage to check with precacheImage and before affich use a Image.network
bool _loadingimage;
ImageProvider _image;
Image _imagescreen;
@override
void initState() {
_loadingimage = true;
_imageUrlfocusNode.addListener(_updateImageUrl);
super.initState();
}
@override
void dispose() {
_imageUrlfocusNode.removeListener(_updateImageUrl);
_quantityfocusNode.dispose();
_imageUrlConroller.dispose();
_imageUrlfocusNode.dispose();
super.dispose();
}
void _updateImageUrl() {
setState(() {
_image = NetworkImage(_imageUrlConroller.text);
});
if (!_imageUrlfocusNode.hasFocus) {
if (_imageUrlConroller.text.isNotEmpty) {
setState(() {
loadimage();
});
}
}
}
void loadimage() {
_loadingimage = true;
precacheImage(_image, context, onError: (e, stackTrace) {
// log.fine('Image ${widget.url} failed to load with error $e.');
print('error $e');
setState(() {
_loadingimage = false;
print(_loadingimage);
});
});
if (_loadingimage == true) {
_imagescreen = Image.network(
_imageUrlConroller.text,
fit: BoxFit.fill,
);
}
}
Container(
width: 100,
height: 100,
margin: EdgeInsets.only(top: 13, right: 11),
decoration: BoxDecoration(
border: Border.all(
width: 1,
color: Colors.grey,
),
),
child:_imageUrlConroller.text.isEmpty
? Text('enter an url')
: !_loadingimage
? Container(
child: Icon(Icons.add_a_photo),
)
: Container(
child: _imagescreen,
),
),