Procházet zdrojové kódy

Merge branch 'main' into jk/mobile-fixes

Jonathan Kelley před 1 rokem
rodič
revize
ef288d02d7

+ 13 - 0
examples/error_handle.rs

@@ -20,6 +20,14 @@ fn app() -> Element {
             },
             DemoC { x: 1 }
         }
+
+        ErrorBoundary {
+            handle_error: |error: CapturedError| rsx! {
+                h1 { "Another error occurred" }
+                pre { "{error:#?}" }
+            },
+            ComponentPanic {}
+        }
     }
 }
 
@@ -40,3 +48,8 @@ fn DemoC(x: i32) -> Element {
         }
     }
 }
+
+#[component]
+fn ComponentPanic() -> Element {
+    panic!("This component panics")
+}

+ 0 - 6
packages/cli/src/builder.rs

@@ -335,12 +335,6 @@ pub fn build_desktop(
     let _manganis_support = ManganisSupportGuard::default();
     let _guard = AssetConfigDropGuard::new();
 
-    // set the asset dir via cli args
-    env::set_var(
-        "DIOXUS_ASSET_DIR",
-        config.asset_dir().canonicalize().unwrap(),
-    );
-
     let mut cmd = subprocess::Exec::cmd("cargo")
         .set_rust_flags(rust_flags)
         .env("CARGO_TARGET_DIR", &config.target_dir)

+ 6 - 1
packages/core/src/any_props.rs

@@ -1,4 +1,8 @@
-use crate::{nodes::RenderReturn, ComponentFunction};
+use crate::{
+    innerlude::{throw_error, CapturedPanic},
+    nodes::RenderReturn,
+    ComponentFunction,
+};
 use std::{any::Any, panic::AssertUnwindSafe};
 
 pub(crate) type BoxedAnyProps = Box<dyn AnyProps>;
@@ -79,6 +83,7 @@ impl<F: ComponentFunction<P, M> + Clone, P: Clone + 'static, M: 'static> AnyProp
             Err(err) => {
                 let component_name = self.name;
                 tracing::error!("Error while rendering component `{component_name}`: {err:?}");
+                throw_error::<()>(CapturedPanic { error: err });
                 RenderReturn::default()
             }
         }

+ 15 - 1
packages/core/src/error_boundary.rs

@@ -13,6 +13,20 @@ use std::{
     rc::Rc,
 };
 
+/// A panic in a component that was caught by an error boundary.
+///
+/// NOTE: WASM currently does not support caching unwinds, so this struct will not be created in WASM.
+pub struct CapturedPanic {
+    /// The error that was caught
+    pub error: Box<dyn Any + 'static>,
+}
+
+impl Debug for CapturedPanic {
+    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
+        f.debug_struct("CapturedPanic").finish()
+    }
+}
+
 /// Provide an error boundary to catch errors from child components
 pub fn use_error_boundary() -> ErrorBoundary {
     use_hook(|| provide_context(ErrorBoundary::new()))
@@ -201,7 +215,7 @@ pub trait Throw<S = ()>: Sized {
     }
 }
 
-fn throw_error<T>(e: impl Debug + 'static) -> Option<T> {
+pub(crate) fn throw_error<T>(e: impl Debug + 'static) -> Option<T> {
     if let Some(cx) = try_consume_context::<ErrorBoundary>() {
         match current_scope_id() {
             Some(id) => cx.insert_error(id, Box::new(e), Backtrace::capture()),

+ 1 - 1
packages/hot-reload/src/file_watcher.rs

@@ -243,7 +243,7 @@ pub fn init<Ctx: HotReloadingContext + Send + 'static>(cfg: Config<Ctx>) {
         // FIXME: use a more robust system here for embedded discovery
         //
         // https://github.com/DioxusLabs/dioxus/issues/1914
-        if listening_paths == &[""] {
+        if listening_paths == [""] {
             for entry in std::fs::read_dir(&crate_dir)
                 .expect("failed to read rust crate directory. Are you running with cargo?")
             {