Есть ли способ контролировать исключения, запускаемые Image.network (), чтобы вы могли предоставить ему AssetImage по умолчанию?
Ошибка, например, попытка прочитать несуществующий URL
Это зависит от вашего варианта использования, но один из способов сделать это - использовать FadeInImage
, который имеет свойство img
для изображения, которое предназначено для загрузки, и placeholder
, ну, для заполнителя
FadeInImage(image: NetworkImage(url), placeholder: AssetImage(assetName)
Вы также можете прослушивать, пока изображение не загрузится, и показывать заполнитель самостоятельно, пока выборка изображения не разрешится.
псевдокод
bool _loaded = false;
var img = Image.network(src);
var placeholder = AssetImage(assetName)
@override
void initState() {
super.initState();
img.image.resolve(ImageConfiguration()).addListener((i, b) {
if (mounted) {
setState(() => _loaded = true);
}
});
}
@override
Widget build(BuildContext context) {
return YourWidget(
child: _loaded ? img : placeholder,
);
}
You can also listen until the image is loaded
, говоря о ImageProvider
, здесь поможет. Поскольку изображение не содержит прослушиваемого.
Вы можете сделать с FadeInImage.assetNetwork
child: new Container(
child: FadeInImage.assetNetwork(
placeholder: 'place_holder.jpg',
image:url
)
)
и в pubspec.yaml
assets:
- assets/place_holder.jpg
как обрабатывать нулевой URL-адрес с помощью FadeInImAGE ??
вы должны указать полный путь, а не только имя.
Есть новый пакет под названием cached_network_image
, который делает то, что вам нужно.
Здесь вы можете прямо из коробки установить «загружаемое» изображение и изображение «ошибка».
A flutter library to show images from the internet and keep them in the cache directory. https://pub.dev/packages/cached_network_image#-readme-tab-
CachedNetworkImage(
imageUrl: "http://via.placeholder.com/350x150",
placeholder: (context, url) => new CircularProgressIndicator(),
errorWidget: (context, url, error) => new Icon(Icons.error),
),
или вы можете использовать собственное изображение актива в качестве заполнителя, например:
...
placeholder: (context, url) => {return Image.asset('assets/img/my_placeholder.png');},
Добавьте это в файл pubspec.yaml вашего пакета:
dependencies:
cached_network_image: ^1.1.1
и импортируйте в свой код дротика:
import 'package:cached_network_image/cached_network_image.dart';
this: placeholder: (context, url) => {return Image.asset ('assets / img / my_placeholder.png');} вообще не работает
@Kornel попробуйте использовать (context) => Image.asset ('assets / img / my_placeholder.png'),
Проблема:
Image.Network не предоставляет никаких функций / функций для отображения виджета ошибки, если изображение не было успешно загружено по какой-либо причине. Это означает, что ваш URL-адрес всегда должен быть правильным?
Команда Flutter загрузила новое видео о Image Widget 13.01.2020 (https://thewikihow.com/video_7oIAs-0G4mw), но до сих пор не предложила никакого решения. Мы надеемся, что команда flutter скоро решит эту проблему.
Решение: Вы можете использовать кэшированное сетевое изображение, которое предоставляет множество функций / возможностей для загрузки изображения с URL-адреса. Чтобы узнать больше о кэшированном сетевом образе, посетите:
https://pub.dev/packages/cached_network_image
Пример кода пакета:
CachedNetworkImage(
imageUrl: "http://via.placeholder.com/200x150",
imageBuilder:
(context, imageProvider) =>
Container(
decoration: BoxDecoration(
image: DecorationImage(
image: imageProvider,
fit: BoxFit.cover,
colorFilter:
ColorFilter.mode(Colors.red, BlendMode.colorBurn)),
),
),
placeholder: (context, url) =>
CircularProgressIndicator(),
errorWidget: (context, url, error)
=> Icon(Icons.error),
),
Вы можете использовать свойства loadingBuilder и erroBuilder, как указано в официальной документации виджета:
Image.network(
'https://example.com/image.jpg',
errorBuilder: (context, error, stackTrace) {
print(error); //do something
},
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,
),
);
},
),
https://api.flutter.dev/flutter/widgets/Image/loadingBuilder.htmlhttps://api.flutter.dev/flutter/widgets/ImageErrorWidgetBuilder.html
Что вы подразумеваете под исключением? ]