Dioxus - 生成未被执行

问题描述 投票:0回答:1

我正在使用 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”功能不起作用,尽管看起来这就是你应该如何使用它?

rust rust-tokio dioxus
1个回答
0
投票

根据您的代码,我对其进行了一些简化,只是为了拥有更干净的空间,经过测试并且它正在工作。

您可以在此处找到示例代码。

这就是结果:

screenshot

希望有帮助!

© www.soinside.com 2019 - 2024. All rights reserved.