diff --git a/rust/src/bridge/callbacks.rs b/rust/src/bridge/callbacks.rs index 7db2b450..6aaaafcc 100644 --- a/rust/src/bridge/callbacks.rs +++ b/rust/src/bridge/callbacks.rs @@ -7,9 +7,10 @@ use protocols::user_discovery::traits::{AnnouncedUser, OtherPromotion}; use crate::error::{Result, TwonlyError}; use crate::{callback_generator, frb_generated::StreamSink}; -use std::sync::{Arc, OnceLock}; +use std::sync::Arc; -static FLUTTER_CALLBACKS: OnceLock = OnceLock::new(); +static FLUTTER_CALLBACKS: std::sync::RwLock> = + std::sync::RwLock::new(None); // This will also generate the function init_flutter_callbacks which MUST be called from Flutter to initialize the callbacks callback_generator! { @@ -39,8 +40,10 @@ callback_generator! { } } -pub(crate) fn get_callbacks() -> Result<&'static FlutterCallbacks> { +pub(crate) fn get_callbacks() -> Result { FLUTTER_CALLBACKS - .get() + .read() + .unwrap() + .clone() .ok_or(TwonlyError::MissingCallbackInitialization) } diff --git a/rust/src/bridge/callbacks/macros.rs b/rust/src/bridge/callbacks/macros.rs index 7fd28918..61700f88 100644 --- a/rust/src/bridge/callbacks/macros.rs +++ b/rust/src/bridge/callbacks/macros.rs @@ -13,6 +13,7 @@ macro_rules! callback_generator { ) => { // 1. Generate the Nested Sub-Structs $( + #[derive(Clone)] pub(crate) struct $sub_struct_name { $( pub(crate) $fn_name: Arc DartFnFuture<$output> + Send + Sync + 'static>, @@ -21,6 +22,7 @@ macro_rules! callback_generator { )* // 2. Generate the Main Container Struct + #[derive(Clone)] pub(crate) struct $struct_name { $( pub(crate) $sub_struct_field: $sub_struct_name, @@ -48,9 +50,8 @@ macro_rules! callback_generator { }; // Use the static global strictly named FLUTTER_CALLBACKS - FLUTTER_CALLBACKS.set(callbacks).unwrap_or_else(|_| { - println!("Callbacks were already initialized!"); - }); + let mut lock = FLUTTER_CALLBACKS.write().unwrap(); + *lock = Some(callbacks); } } };