반응형
Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
Tags
- uint16array
- Game js
- KakaoMap
- RouteObserver
- Completer
- uint8array
- FirebaseAnalytics
- Raycasting
- Redux
- webrtc
- jszip
- code editor
- Image Resize typescript
- androidId
- babel
- methodChannel
- identifierForVender
- Babel standalone
- swagger-typescript-api
- Flutter
- Three-fiber
- typescript
- Three js
- Prism.js
- web track
- node
- REST API
- Excel
- react
- userevent_tracker
Archives
- Today
- Total
Never give up
Flutter - CachedNetworkImageProvider error handling? 본문
반응형
일반적인 위젯에는 CachedNetworkImage를 사용하면 되지만
Container의 boxdecoration이나 CircleAvatar같은경우
backgroundImage에 넣어줘야되는데 데이터 타입이 ImageProvider입니다
그래서 CachedNetworkImageProvider를 사용해야되는데
error핸들링을 어떻게 해야될지 막막합니다
API에 보면 errorListener가 있어서 사용하면 될거같지만 아쉽게도 deprecated됐습니다
그럼 어떻게 해결을 해야될까 고민하게 될텐데 생각보다 간단하게 해결 가능합니다
간단한 예제로 한번보겠습니다
메인
class _CachedNetworkImageExampleState extends State<CachedNetworkImageExample> {
final String url =
"https://tistory2.daumcdn.net/tistory/4094024/attach/7f8b505900234bf1a50e17f17e8b8526";
//제 프로파일 url입니다
final String errorURL = 'test';
ImageClass image, errorImage;
@override
void initState() {
super.initState();
image = ImageClass(url);
errorImage = ImageClass(errorURL);
}
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(title: Text('CachedNetworkImage example')),
body: Column(
mainAxisAlignment: MainAxisAlignment.spaceEvenly,
crossAxisAlignment: CrossAxisAlignment.stretch,
children: [
CircleAvatar(radius: 50, backgroundImage: image.getImageProvider),
errorImage.getImage,
CircleAvatar(
radius: 50, backgroundImage: errorImage.getImageProvider),
image.getImage
],
),
);
}
}
Image class
class ImageClass {
String url;
ImageClass(this.url);
Widget get getImage => CachedNetworkImage(
imageUrl: url,
imageBuilder: (context, imageProvider) =>
CircleAvatar(radius: 50, backgroundImage: imageProvider),
errorWidget: (context, url, error) =>
CircleAvatar(radius: 50, child: Icon(Icons.error_outline)));
ImageProvider get getImageProvider => CachedNetworkImageProvider(url);
}
imagebuilder부분에 2번째 인자의 데이터 타입이 ImageProvider이기때문에
backgroundImage에 그대로 넣어도 되고 에러도 핸들링 할 수 있어서 더 좋은방법인거 같습니다
반면 ImageProvider를 쓰면 error가 발생하면 핸들링 할 방법이 없고
로딩이 되는동안 Indicator를 보여줄 방법도 없습니다
그래서 imageBuilder를 이용하는것이 조금 더 좋은거 같습니다
추가로 테스트중 발견된 문제점이 있는데
url값이 null일 때 에러가 발생이 되는것을 확인했습니다
해결방법으로는 null체크 후 다른 위젯을 반환하면 간단하게 처리할 수 있습니다
Widget get getImage {
if (url == null) {
return CircleAvatar(radius: 50, child: Icon(Icons.error_outline));
} else {
return CachedNetworkImage(
imageUrl: url,
placeholder: (context, url) =>
CircleAvatar(child: Center(child: CircularProgressIndicator())),
imageBuilder: (context, imageProvider) =>
CircleAvatar(radius: 50, backgroundImage: imageProvider),
errorWidget: (context, url, error) =>
CircleAvatar(radius: 50, child: Icon(Icons.error_outline)));
}
}
반응형
'Flutter' 카테고리의 다른 글
Flutter - PageView with TabBar and Indicator (0) | 2021.01.03 |
---|---|
Flutter - Provider Selector with tuple (3) | 2020.12.31 |
Flutter - When you store collection in cloud firestore (0) | 2020.12.23 |
Flutter - When to use Enum(feat. authentication) (2) | 2020.11.30 |
Flutter - context, key example with snackbar, provider (0) | 2020.11.16 |
Comments