-
-
Notifications
You must be signed in to change notification settings - Fork 1.2k
Open
Labels
corerelating to the core implementation of the virtualdomrelating to the core implementation of the virtualdomenhancementNew feature or requestNew feature or request
Description
Problem
Steps To Reproduce
use dioxus::prelude::*;
#[server]
async fn save_dog(image: String) -> Result<(), ServerFnError> {
Ok(())
}
#[component]
fn DogView() -> Element {
let src = use_signal(|| "https://images.dog.ceo/breeds/pitbull/dog-3981540_1280.jpg");
let save = async move |_| {
save_dog(src.cloned().to_owned()).await.unwrap();
};
rsx! {
img { src }
div {
button { onclick: save, "save!" }
}
}
}
Error:
error: async closure does not implement `FnMut` because it captures state from its environment
--> src/main.rs:104:16
|
104 | let save = async move |_| {
| ^^^^^^^^^^^^^^
...
113 | button { onclick: save, "save!" }
| ------------- required by a bound introduced by this call
|
= note: required for `Callback<dioxus::prelude::Event<MouseData>>` to implement `SuperFrom<{async closure@src/main.rs:104:16: 104:30}, MarkerWrapper<dioxus::dioxus_core::events::AsyncMarker>>`
= note: required for `{async closure@src/main.rs:104:16: 104:30}` to implement `SuperInto<Callback<dioxus::prelude::Event<MouseData>>, MarkerWrapper<dioxus::dioxus_core::events::AsyncMarker>>`
But it works when you use an inner async block instead:
- let save = async move |_| {
+ let save = move |_| async move {
save_dog(src.cloned().to_owned()).await.unwrap();
};
Expected behavior
Async closures has been stabilized, so it should be expected that it works with Dioxus.
Screenshots
Environment:
- Dioxus version: v0.6.0
- Rust version: v1.85.0-nightly (45d11e51b 2025-01-01)
- OS info: Linux
- App platform:
web
Questionnaire
Metadata
Metadata
Assignees
Labels
corerelating to the core implementation of the virtualdomrelating to the core implementation of the virtualdomenhancementNew feature or requestNew feature or request