【tauri+rust】App会加载白屏,有时显示在左上角显示一小块,如何优化

使用tauri做App时不可避免的会遇到上图问题,Tauri在启动时会先创建原生窗口,然后才加载WebView引擎并执行前端代码,这就导致存在一个时间差。当前端框架初始化耗时较为明显,Vue/React等现代前端框架需要完成虚拟DOM构建、组件挂载等。

解决方案

在创建时我们先将原生窗口改为不可见,等前端界面加载完成后再加载窗口即可。

主要操作如下:

1、tauri.conf.json设置visible:false
2、main.rs增加命令:show_main_window,
rust 复制代码
// 显示主窗口
#[tauri::command]
pub async fn show_main_window(window: tauri::Window) -> Result<(), String> {
    log::info!("Frontend requested to show main window");
    
    // 短暂延迟确保渲染完成
    tokio::time::sleep(std::time::Duration::from_millis(200)).await;
    
    window.show().map_err(|e| e.to_string())?;
    window.center().map_err(|e| e.to_string())?;
    window.set_focus().map_err(|e| e.to_string())?;
    
    log::info!("Main window is now visible");
    Ok(())
}
3、App.vue增加调用show_main_window
javascript 复制代码
import { invoke } from '@tauri-apps/api/core';

onMounted(async () => {
  // 初始化多语言
  localStorage.setItem('client-lang', 'zh_CN');
  // 初始化本地数据库
  try {
    await localDB.init();
    console.log('本地数据库初始化成功');
  } catch (error) {
    console.error('本地数据库初始化失败:', error);
  }
  try {
    // 等待 Vue 应用完全挂载
    await new Promise(resolve => setTimeout(resolve, 500))
    await invoke('show_main_window')
    
  } catch (error) {
    console.error('Failed to show window:', error)
    // 备用方案:直接使用 API
    try {
      await appWindow.show()
      await appWindow.center()
    } catch (fallbackError) {
      console.error('Fallback also failed:', fallbackError)
    }
  }
});
</script>
相关推荐
前端世界43 分钟前
float 还是 double?用储罐体积计算带你看懂 C 语言浮点数的真实世界坑
java·c语言·开发语言
aiopencode44 分钟前
网络调试工具推荐,Fiddler抓包教程、HTTPS配置与接口调试完整指南
后端
豐儀麟阁贵1 小时前
8.5在方法中抛出异常
java·开发语言·前端·算法
q***38511 小时前
SpringBoot + vue 管理系统
vue.js·spring boot·后端
zengyuhan5031 小时前
Windows BLE 开发指南(Rust windows-rs)
前端·rust
Bro_cat1 小时前
Java基础
java·开发语言·面试
滨HI01 小时前
C++ opencv简化轮廓
开发语言·c++·opencv
小青龙emmm1 小时前
2025级C语言第二次周测(国教专用)题解
c语言·开发语言·算法
醉方休1 小时前
Webpack loader 的执行机制
前端·webpack·rust