CircleAvatar 성능 향상
안녕하세요 선생님 N번째 다시 복습하고 있는 수강생입니다.
저의경우, CircleAvator의 backgroundImage 속성에 ExtendedNetworkImageProvider 위젯을 사용하여 프로필 이미지를 받아와서 로딩하는데 시간이 대략 1.5초 쯤 소요되며, 그 1.5초의 시간 동안 기본 배경 색상인 보라색 원이 대신하여 나타납니다.
똑같이 ExtendedNetworkImageProvider 위젯을 사용하는 게시물의 이미지들은 프로필 사진보다 용량이 훨씬 큰데도 불구하고 거의 바로 이미지가 로딩되는데, 프로필 이미지의 로딩 속도가 더 느린 이유는 무엇일까요?
배경색상이 보이다가 네트워크 이미지가 로딩되는 방향 말고,
프로필 이미지의 로딩이 완전히 끝나기 전까지 fetching상태를 유지하여 로딩바를 보여주거나, 프로필이미지를 받아오는 속도를 높일 방법이 없을까요?
또는 이미지가 로딩되는 동안 배경색을 표시하는게 아니라, 로딩중을 표현할 수 있는 방법이 있을까요?
답변 기다리겠습니다. 감사합니다!
답변 2
0
이미지를 표시할 때,
게시물 이미지는ExtendedImage.network를 사용하고
프로필 이미지는ExtendedAssetImageProvider를 사용하고 있습니다.
ExtendedImage 의 문서를 찾아보니 cache 사용 기본 설정이ExtendedImage.network는 true, ExtendedAssetImageProvider 는 false 로 지정되어 있어서
로딩 속도에 차이가 발생한 것 같습니다.
아마도 이미지를 최초로 읽어올 때에는 게시물 이미지와 프로필 이미지 모두 로딩 시간에 큰 차이가 없고
이후에 화면 이동이나 새로 고침으로 동일한 이미지를 읽어올 경우에 cache 를 사용하지 않는
프로필 이미지의 로딩에 시간이 걸렸을 겁니다.
해결 방법은 ExtendedAssetImageProvider 의 cache 속성값을 true 로 지정하면 됩니다.
child: CircleAvatar(
backgroundImage: userModel.profileImage == null
? ExtendedAssetImageProvider('assets/images/profile.png')
as ImageProvider
: ExtendedNetworkImageProvider(
userModel.profileImage!,
cache: true,
),
radius: 18,
),
이미지를 로딩중일 때, 배경색이 아닌 로딩중임을 알려주는 위젯을 표시하는 방법은
ExtendedImage의loadStateChanged속성을 사용하면 됩니다.
다만, 프로필 사진의ExtendedAssetImageProvider에서는loadStateChanged속성을 사용할 수 없기 때문에
코드의 수정이 필요합니다.class AvatarWidget extends StatelessWidget { final UserModel userModel; const AvatarWidget({ super.key, required this.userModel, }); @override Widget build(BuildContext context) { return GestureDetector( onTap: () { Navigator.push( context, MaterialPageRoute( builder: (context) => ProfileScreen( uid: userModel.uid, ), ), ); }, // ExtendedImage 를 사용하기 위해서 아래와 같이 수정 child: userModel.profileImage == null ? ExtendedImage.asset( // CircleAvatar 의 반지름(radius)이 18 이었으므로 // 이미지의 높이와 너비를 36으로 설정 width: 36, height: 36, // 이미지의 모양을 원형으로 설정 shape: BoxShape.circle, 'assets/images/profile.png', // 이미지를 높이, 너비 36의 원형의 모양에 꽉 차도록 설정 fit: BoxFit.cover, ) : ExtendedImage.network( width: 36, height: 36, shape: BoxShape.circle, userModel.profileImage!, fit: BoxFit.cover, // 이미지 로딩 상태에 따라 표시할 위젯을 설정 loadStateChanged: (state) { switch (state.extendedImageLoadState) { case LoadState.loading: case LoadState.failed: // 로딩중, 로딩 실패의 경우 CircularProgressIndicator 를 표시 return CircularProgressIndicator(); case LoadState.completed: // 로딩 완료의 경우, 이미지를 그대로 표시하기 위해서 null 반환 // (ExtendedImage 의 문서에서 null 을 반환하도록 알려주고 있습니다.) // https://pub.dev/packages/extended_image#demo-code return null; } }, ), // child: CircleAvatar( // backgroundImage: userModel.profileImage == null // ? ExtendedAssetImageProvider('assets/images/profile.png') // as ImageProvider // : ExtendedNetworkImageProvider( // userModel.profileImage!, // cache: true, // ), // radius: 18, // ), ); } }
실수로 파이어프로젝트를 삭제하여 다시 살렸는데 profile screen이 에러입니다
0
160
1
파이어베이스 연동 중 Auth 및 ImagePicker 오류 발생, 도움 요청드립니다.
0
157
2
파이어베이스에서 실수로 강의프로젝트를 실수로 삭제하였습니다.도와주세요
0
191
2
파이어베이스 스토리지 설정에 프로젝트 업그레이드 라고 뜨는데 어떻게 하면됩니까
0
239
1
이거는 왜그렇죠
0
160
1
셋팅에 문제가생겼네요
0
149
2
마치면서 에러가 댓글가져오기와 좋아요 리스트 가져오기 에러
0
114
1
섹션15페이징기능_4프로필 화면에 페이징 적용
0
103
1
섹션15페이징기능_3좋아요 목록 화면에 페이징 적용
0
189
1
섹션14페이징기능_1게시글 목록 화면에 페이징 적용 feed_repository.dart에러
0
109
1
11셕션에서 좋아요.강의코드에서 좋아요 업데이트 문제 제대로 수정된건가요
0
126
1
12댓글화면_3댓글정보 가져오기
0
232
2
11댓글화면_댓글 정보 가져오기에서 콘솔에 commentList못찍고 있어요
0
84
1
섹션11 좋아요 목록화면에서 콘솔에서 FeedModel 데이터를 못가지고 있어요
0
94
1
섹션11 좋아요.누른 게시글 정보를 화면에표시에서 Exception 왜 발생합니까
0
149
0
Storage사용..?
0
930
2
10 게시물 화면에서 조금헷갈려서요
0
142
2
게시글 이미지 슬라이드 기능추가 carouselslider에러가 났습니다
0
150
1
섹션8 게시글 정보 화면에 표시
0
116
1
섹션8 게시글 정보가져오기
0
126
1
섹션8 게시글 정보 가져오기
0
96
1
섹션8 게시글 정보 가져오기 feedModel를 못받아오는것 같습니다.
0
130
1
메인화면에서 뒤로가기 눌렀을때 어플종료관련 건
0
191
1
섹션8 게시글 정보가져오기
0
167
2





