我正在使用 Dioxus 0.5 构建一个桌面应用程序,但在我的组件中,“spawn”函数似乎没有执行其中的异步块。它不会给出错误,并且编译得很好,但是单击按钮没有达到预期的效果。其他方法(例如执行“use_future”或从事件处理程序返回 Future)可以正常工作。然而,文档确实显示了在这种情况下使用spawn。
这是一个 spawn 不起作用的组件:
use crate::logic::models::{Gender, Publisher};
use crate::logic::publishers_service;
use crate::AppState;
use dioxus::prelude::*;
#[component]
pub fn AddPublisherForm(onsubmit: EventHandler<()>) -> Element {
let onsubmit = move |evt: Event<FormData>| {
let vals = evt.data.values();
let name = vals.get("name");
let gender_string = vals.get("gender").unwrap().as_value();
let gender = match gender_string.as_str() {
"m" => Gender::Male,
"f" => Gender::Female,
_ => Gender::Male,
};
let suspended = vals.get("suspended").is_some();
if name.is_none() {
return ();
}
let name = name.unwrap().as_value();
let state = use_context::<Signal<AppState>>();
println!("Creating user");
spawn(async move {
println!("Inside spawn");
publishers_service::create(
Publisher {
id: None,
name: name.clone(),
gender,
suspended,
},
&state(),
)
.await;
});
onsubmit.call(());
};
rsx! {
div {
form {
onsubmit: onsubmit,
fieldset {
legend {
"Add publiser"
},
input {
name: "name"
},
"male",
input {
r#type: "radio",
name: "gender",
value: "m",
checked: true
},
"female",
input {
r#type: "radio",
name: "gender",
value: "f",
checked: false
}
"suspended",
input {
r#type: "checkbox",
name: "suspended",
checked: false
}
button {
"create"
}
}
}
}
}
}
提交时,我看到消息“正在创建用户”和“正在刷新发布者”(来自父元素中的 onsubmit 回调),但没有看到“内部生成”,并且即使服务上的方法是,也不会创建用户正确(并且之前工作过,当我使用“use_future”时)
我不知道这是否重要(我想它不重要),但我在主文件中做了一些事情,以在启动 Dioxus 应用程序之前准备数据库连接:
#[derive(Clone)]
pub struct AppState {
connection: Pool<Sqlite>,
}
fn main() -> Result<()> {
let rt = Runtime::new().unwrap();
let handle = rt.handle();
let db = handle.block_on(async { create_db().await });
let state = AppState { connection: db };
launch_app(state);
Ok(())
}
这是启动应用程序的代码:
pub fn launch_app(state: AppState) {
// Init logger
dioxus_logger::init(Level::INFO).expect("failed to init logger");
LaunchBuilder::desktop()
.with_cfg(
Config::default()
.with_custom_head("<link href=\"./base.css\" rel=\"stylesheet\">".to_string())
.with_menu(None),
)
.with_context(state)
.launch(App);
}
为什么“spawn”功能不起作用,尽管看起来这就是你应该如何使用它?