【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>
相关推荐
利刃大大14 小时前
【SpringBoot】SpringMVC && 请求注解详解 && 响应注解详解 && Lombok
java·spring boot·后端
梨子同志14 小时前
Java 介绍与开发环境安装
后端
010米粉01014 小时前
Qt Cmake之路(一):Cmake变量语法
开发语言·qt·cmake
她说..14 小时前
Spring AOP场景4——事务管理(源码分析)
java·数据库·spring boot·后端·sql·spring·springboot
aini_lovee14 小时前
基于Jousselme距离改进D-S证据理论matlab实现
开发语言·算法·matlab
用户40993225021214 小时前
Vue3动态样式控制:ref、reactive、watch与computed的应用场景与区别是什么?
后端·ai编程·trae
心之语歌14 小时前
3433.统计用户被提及情况
后端
颜*鸣&空14 小时前
Qt Creator快速搭建项目
开发语言·qt
道剑剑非道14 小时前
Qt【使用libmodbus库】
开发语言·数据库·qt
csbysj202014 小时前
PHP 函数
开发语言