Handler

默认情况下,frb 使用 DefaultHandler,你可以实现你自己的 Handler 做你想做的事情。首先,你需要在 Rust 文件中创建一个名为 FLUTTER_RUST_BRIDGE_HANDLER 的变量(可能会用到 lazy_static)。接着,你不一定需要创建一个新的实现了 Handler 的结构体,只需要利用现有的 SimpleHandler,并自定义它的泛型参数,例如Executor

示例

例 1: 除了 Dart 之外,同时向你的后端报告错误

pub struct MyErrorHandler(ReportDartErrorHandler);

impl ErrorHandler for MyErrorHandler {
    fn handle_error(&self, port: i64, error: handler::Error) {
        send_error_to_your_backend(&error);
        self.0.handle_error(port, error)
    }

    ...
}

例 2: 记录函数执行开始和结束的时间

pub struct MyExecutor(ThreadPoolExecutor<MyErrorHandler>);

impl Executor for MyExecutor {
    fn execute<TaskFn, TaskRet>(&self, wrap_info: WrapInfo, task: TaskFn) {
        let debug_name_string = wrap_info.debug_name.to_string();
        self.thread_pool_executor
            .execute(wrap_info, move |task_callback| {
                Self::log_around(&debug_name_string, move || task(task_callback))
            })
    }
}

impl MyExecutor {
    fn log_around<F, R>(debug_name: &str, f: F) -> R where F: FnOnce() -> R {
        let start = Instant::now();
        debug!("(Rust) execute [{}] start", debug_name);
        let ret = f();
        debug!("(Rust) execute [{}] end delta_time={}ms", debug_name, start.elapsed().as_millis());
        ret
    }
}