C.W.K.
Stream
Lesson 01 of 06 · published

State<T>로 managed state

~13 min · tauri, state, rust, manage

Level 0웹 관광객
0 XP0/56 lessons0/13 achievements
0/100 XP to next level100 XP to go0% complete
"command는 무상태 함수야. 함께 뭔가 기억해야 할 때, 앱한테 기억을 줘: managed state."

한 번 등록, 어디서나 주입

command 혼자선 호출 사이에 모든 걸 잊어. 데이터를 공유하려면 — 설정, DB 풀, 카운터, 캐시 — Builder에서 .manage(value)관리해. 그 뒤엔 어떤 command든 tauri::State<T> 타입 파라미터를 선언해서 달라고 할 수 있어. Tauri가 그 파라미터를 보고 managed 인스턴스를 자동 주입해. 프론트엔드는 절대 안 넘겨. 전부 코어에 살아.

타입당 managed 값 하나

managed state는 타입으로 키가 매겨져. AppConfig 하나, Database 하나, Counter 하나를 관리해 — State<AppConfig>를 달라 하면 항상 같은 인스턴스를 줘. 같은 기반 타입짜리가 둘 필요하면 별개 newtype으로 감싸(예: struct ReadPool(Pool)struct WritePool(Pool)) 타입 시스템이 구분하게. 이건 기능이야 — '어느 state?'를 모호하지 않게 만들어.

공유 참조야

네가 받는 건 managed 값으로 가는 공유 읽기 전용 핸들이야. 읽기만 하는 것(로드된 설정)엔 완벽해. 근데 그걸 통해 필드를 직접 못 바꾼다는 뜻이야 — borrow checker가 공유 변경을 안 허락해. state가 바뀌어야 할 땐 interior mutability(Mutex)를 꺼내는데, 그게 바로 다음 레슨이야. 지금은: 읽기 위주 state를 등록하고 필요한 command에 주입해.

Code

한 번 관리, command에 주입·rust
use tauri::Manager;

struct AppConfig {
    api_base: String,
    theme: String,
}

// command가 State<T> 파라미터를 선언해서 managed state를 받아.
#[tauri::command]
fn get_api_base(config: tauri::State<AppConfig>) -> String {
    config.api_base.clone()
}

pub fn run() {
    tauri::Builder::default()
        // 값을 한 번 등록; Tauri가 앱 생애 동안 소유.
        .manage(AppConfig {
            api_base: "https://api.example.com".into(),
            theme: "dark".into(),
        })
        .invoke_handler(tauri::generate_handler![get_api_base])
        .run(tauri::generate_context!())
        .expect("error while running app");
}

External links

Exercise

앱에 managed state를 더해: 읽기 전용 문자열 하나(앱 버전이나 API base 같은)를 든 struct. .manage()로 등록하고, tauri::State로 그걸 읽어 프론트엔드에 반환하는 command를 써. 값이 왕복하는지 확인해. 코어에 첫 공유 메모리를 준 거야.
Hint
두 부분: Builder에 .manage(MyConfig { ... })랑, command 파라미터 config: tauri::State<MyConfig>. 'state not managed' 나오면 command는 썼는데 .manage() 줄을 빠뜨린 거야.

Progress

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

댓글 0

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

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