본문 바로가기
C.W.K.
Stream
Lesson 02 of 06 · published

AppHandle & Manager 트레이트

~13 min · tauri, apphandle, manager, rust

Level 0웹 관광객
0 XP0/56 lessons0/13 achievements
0/100 XP to next level100 XP to go0% complete
"command 안에선 Tauri가 필요한 걸 쥐여줘. command 밖에선 — setup이든 스레드든 타이머든 — AppHandle을 들고 앱 쪽으로 손을 뻗는 거야."

들고 다니는 손잡이

command는 StateWindow를 받아 쓰지만, 코드 상당수는 command 에서 돌아. setup 훅, 백그라운드 스레드, async 태스크, OS 이벤트 콜백 같은 것들. 거기선 AppHandle을 들어. 돌아가는 애플리케이션으로 이어지는, 복제해도 부담 없는 참조야. 복제해서 스레드로 넘기면 어디서든 이벤트를 emit하고, managed state를 읽고, 창을 찾을 수 있어.

Manager 트레이트가 도구상자야

쓸 만한 메서드는 대부분 — .state::<T>(), .emit(), .get_webview_window(), 앱 디렉터리를 찾는 .path()Manager 트레이트에서 와. App, AppHandle, Window, WebviewWindow가 전부 이걸 구현해서, setup의 &App을 쥐고 있든 스레드 깊숙한 곳의 AppHandle을 쥐고 있든 같은 도구상자를 써. 그 메서드들을 켜는 스위치가 use tauri::Manager;야.

주입 없이 state에 닿기

command 안에선 State<T>를 파라미터로 받아. 밖에선 손잡이에서 꺼내 — app.state::<T>()가 똑같이 맡아둔 그 인스턴스를 돌려줘. 백그라운드 루프가 command랑 같은 설정을 읽거나, setup 훅이 캐시를 미리 채워두는 게 다 이 방식이야. 맡아둔 값은 하나인데, 코드가 어디서 도느냐에 따라 닿는 길이 둘인 거지.

Code

AppHandle을 백그라운드 스레드로 들고 가기·rust
use tauri::Manager;
use std::time::Duration;

pub fn run() {
    tauri::Builder::default()
        .manage(AppConfig { /* ... */ })
        .setup(|app| {
            // 백그라운드 스레드가 앱을 쓰게 핸들 복제.
            let handle = app.handle().clone();
            std::thread::spawn(move || {
                loop {
                    std::thread::sleep(Duration::from_secs(5));
                    // command 밖에서 managed state에 닿기:
                    let cfg = handle.state::<AppConfig>();
                    // 프론트엔드에 소식 밀기 (이벤트: 다음 레슨들):
                    let _ = handle.emit("tick", cfg.theme.clone());
                }
            });
            Ok(())
        })
        .run(tauri::generate_context!())
        .expect("error while running app");
}

External links

Exercise

setup() 훅에서 AppHandle을 복제하고, 루프 안에서 3초씩 자면서 그 핸들로 뭔가 출력하는(맡겨둔 state를 읽어서 찍는다든지) std::thread를 띄워봐. UI가 멀쩡히 반응하는 동안 백그라운드에서 도는지 확인해. 이벤트랑 타이머가 전부 기대는 패턴, '핸들을 command 바깥 세계로 들고 나가기'를 연습하는 거야.
Hint
let handle = app.handle().clone(); 그다음 std::thread::spawn(move || { loop { sleep; let s = handle.state::<MyState>(); ... } }). move 키워드가 복제한 핸들을 스레드 안으로 넘겨줘.

Progress

Progress is local-only — sign in to sync across devices.
이 페이지에서 버그를 발견하셨거나 피드백이 있으세요?문제 신고

댓글 0

🔔 답글 알림 (로그인 필요)
로그인댓글을 남기려면 로그인해 주세요.

아직 댓글이 없어요. 첫 댓글을 남겨보세요.