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

Flutter ConnectionState.waiting状态下AssetImage无法显示问题咨询

问题原因

你遇到的现象本质是异步任务调度优先级和组件重复重建的问题:AssetImage的资源加载属于UI侧低优先级异步任务,优先级低于你传给FutureBuilder的getIsLogin()任务,getIsLogin()执行完成前图片加载回调不会被调度;同时FutureBuilder状态切换时重复创建LoginScreen实例,会打断正在进行的图片加载流程,导致需要等Future完成后才能重新加载显示图片。


解决方案

方案1:预缓存登录页资源图片(推荐)

在应用启动阶段提前把图片加载到内存缓存中,后续使用时直接读取缓存,不会触发异步加载流程。修改main函数代码如下:

void main() async {
  // 确保Flutter基础框架初始化完成
  WidgetsFlutterBinding.ensureInitialized();
  // 预缓存登录页用到的图片
  await precacheImage(
    const AssetImage("asset/images/banner.jpg"),
    WidgetsBinding.instance.rootElement!,
  );
  runApp(const MyApp());
}

方案2:避免FutureBuilder重复创建LoginScreen实例

不要在builder方法里每次都实例化新的LoginScreen,提前创建好实例复用,防止图片加载被中断,修改main.dart代码如下:

// 提前实例化LoginScreen,全程复用同一个对象
final LoginScreen loginScreen = const LoginScreen();

// 省略其他层级代码
home: FutureBuilder(
  future: getIsLogin(),
  builder: (BuildContext context, AsyncSnapshot<dynamic> snapshot) {
    if(snapshot.connectionState == ConnectionState.waiting){
      return loginScreen;
    }
    // 已登录返回首页,未登录返回登录页,同样复用已有实例
    return snapshot.data == true ? const HomePage() : loginScreen;
  },
)

方案3:优化getIsLogin()执行逻辑

检查getIsLogin()内部是否存在同步阻塞操作、CPU密集计算逻辑,如果有将这部分逻辑移到独立Isolate中执行,避免阻塞主事件循环导致UI渲染(包括图片加载)被卡住。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.02 13:39:03