You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Flutter中使用CachedNetworkImage监听图片加载完成以显示其他组件

解决CachedNetworkImage加载完成后再显示文字组件的问题

要实现图片完全加载后才显示文字组件,核心是利用CachedNetworkImage提供的加载回调控制文字的显示时机,具体步骤如下:

1. 管理加载状态

在你的Widget中添加状态变量,标记图片是否加载完成:

bool _isImageLoaded = false;

注:如果当前是StatelessWidget,需要改成StatefulWidget才能使用状态管理。

2. 配置CachedNetworkImage的加载回调

给CachedNetworkImage添加imageLoadedCallback参数,图片成功加载时更新状态:

CachedNetworkImage(
  fadeInDuration: const Duration(milliseconds: 300),
  imageUrl: image,
  height: double.infinity,
  fit: BoxFit.cover,
  // 图片加载完成触发的回调
  imageLoadedCallback: (image) {
    setState(() {
      _isImageLoaded = true;
    });
  },
  imageBuilder: (context, imageProvider) => Stack(children: [
    Container(
        decoration: BoxDecoration(
            image: DecorationImage(
                image: imageProvider, fit: BoxFit.cover))),
    Container(
      color: Colors.black.withOpacity(0.4),
    )
  ]),
)

3. 控制文字组件的显示

把需要延迟显示的文字组件用状态变量控制,提供两种实现方式:

方式一:直接显示/隐藏(简单粗暴)

Padding(
  padding: const EdgeInsets.only(left: 2.0, bottom: 2),
  child: Align(
    alignment: Alignment.bottomLeft,
    child: Visibility(
      visible: _isImageLoaded,
      child: Text(title),
    ),
  ),
),
Visibility(
  visible: _isImageLoaded && discount != 0,
  child: Align(
    alignment: Alignment.topRight,
    child: Container(
      margin: const EdgeInsets.only(top: 2, right: 2),
      padding: const EdgeInsets.all(2),
      decoration: BoxDecoration(
        borderRadius: BorderRadius.circular(10),
        gradient: const LinearGradient(
          begin: Alignment(-1.238, -1.313),
          end: Alignment(3.464, 3.196),
          colors: <Color>[
            Color(0xfff9d423),
            Color(0xfffc8e3a),
            Color(0xffff4e50)
          ],
          stops: <double>[0.038, 0.5, 0.928],
        ),
      ),
      child: Text("$discount%"),
    ),
  ),
)

方式二:添加淡入动画(更流畅)

用AnimatedOpacity实现文字渐显效果,和图片的fadeInDuration保持一致,视觉更统一:

Padding(
  padding: const EdgeInsets.only(left: 2.0, bottom: 2),
  child: Align(
    alignment: Alignment.bottomLeft,
    child: AnimatedOpacity(
      opacity: _isImageLoaded ? 1.0 : 0.0,
      duration: const Duration(milliseconds: 300),
      child: Text(title),
    ),
  ),
),
Visibility(
  visible: discount != 0,
  child: Align(
    alignment: Alignment.topRight,
    child: AnimatedOpacity(
      opacity: _isImageLoaded ? 1.0 : 0.0,
      duration: const Duration(milliseconds: 300),
      child: Container(
        margin: const EdgeInsets.only(top: 2, right: 2),
        padding: const EdgeInsets.all(2),
        decoration: BoxDecoration(
          borderRadius: BorderRadius.circular(10),
          gradient: const LinearGradient(
            begin: Alignment(-1.238, -1.313),
            end: Alignment(3.464, 3.196),
            colors: <Color>[
              Color(0xfff9d423),
              Color(0xfffc8e3a),
              Color(0xffff4e50)
            ],
            stops: <double>[0.038, 0.5, 0.928],
          ),
        ),
        child: Text("$discount%"),
      ),
    ),
  ),
)

额外说明

如果图片是从本地缓存加载,imageLoadedCallback会立即触发,文字不会有不必要的延迟,完全适配缓存场景。

内容的提问来源于stack exchange,提问作者krishnaacharyaa

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.07 11:15:37