我在后端(tauri)上有一个命令返回一个字符串(从windows注册表的轻主题值).我需要把它放在前端+听如果这个字符串改变.我在leptos或tauri docs中找不到所需的函数. 所以我想出了这个拐杖在前端:
let (is_light_theme, set_is_light_theme) = create_signal(String::new());
let is_light_theme_fn = move || {
spawn_local(async move {
let is_light_theme_fetch = invoke("is_light_theme", to_value("").unwrap())
.await
.as_string()
.unwrap();
set_is_light_theme.set(_is_light_theme_);
loop {
let old_value = is_light_theme.get();
let new_value = invoke("is_light_theme", to_value("").unwrap())
.await
.as_string()
.unwrap();
if new_value != old_value {
set_is_light_theme.set(new_value);
};
// sleep(Duration::from_millis(2000)).await; // breaks loop
}
});
};
is_light_theme_fn();
在后端执行tauri命令:
#[tauri::command]
fn is_light_theme() -> String {
let theme = helpers::is_light_theme();
format!("{}", theme)
}
is_light_theme
名助手:
pub fn is_light_theme() -> bool {
let val = CURRENT_USER
.open(r#"Software\Microsoft\Windows\CurrentVersion\Themes\Personalize"#)
.expect("Failed to get registry key")
.get_u32("AppsUseLightTheme")
.expect("Failed to get registry value");
println!("{}", val);
val != 0
}
这运行得有点不错,但这个循环非常需要处理. 我试着把sleep从std:thread和tokio添加到循环中,它们都 destruct 了它.
也许有一种更好的方法来监听后端的价值变化?