😽
【Flutter】precacheImageで画像を読み込んでから画面を表示する
試したこと
- Flutterで
precacheImage
を使って、画像の読み込みが完了してから、画面全体を表示するようにした- 画像読込中は、
CircularProgressIndicator
を表示させるようにした
- 画像読込中は、
通常の場合
画像の読み込みが遅れるので、一回文字等が表示されてから、遅れて画像が表示されてしまう
precacheImage使用後
画像が読み込まれるまで、ローディングを出すようにした
コード例
import 'package:flutter/material.dart';
import 'package:flutter_hooks/flutter_hooks.dart';
import 'package:hooks_riverpod/hooks_riverpod.dart';
class PreCacheImagePage extends HookConsumerWidget {
const PreCacheImagePage({super.key});
Widget build(BuildContext context, WidgetRef ref) {
final isImageLoaded = useState(false);
const image = Image(
image: NetworkImage(
"https://via.placeholder.com/500x500",
),
);
Future<void> cacheImage() async {
try {
await precacheImage(image.image, context);
} finally {
isImageLoaded.value = true;
}
}
useEffect(() {
WidgetsBinding.instance.addPostFrameCallback((_) {
cacheImage();
});
return null;
}, []);
return Scaffold(
appBar: AppBar(
title: const Text('PreCache Image'),
),
body: Center(
child: isImageLoaded.value
? const Column(
children: [
Text('PreCache Image'),
image,
],
)
: const CircularProgressIndicator(),
),
);
}
}
Discussion
あえてprecacheImageを使われた感じですよね!
今回の使い方ならloadingBuilder使うほうが良いかなーと思ってみてました。
ご参考までにおいておきます!!
ありがとうございます!実際には、ローカルのアセット画像の読み込みで一瞬表示が遅れるのを回避したかったので検討しました。(assetだと一瞬すぎて分かりづらかったので、コード例ではnetworkにしました)ネットワークからの取得であれば、コメントいただいた方法やcached_network_imageを使えますよねー