Files
obsidian-vault/wiki/tech/reflect-skip-fuse.md
T

3.1 KiB
Raw Blame History

title, created, updated, last_synced, type, namespace, tags, confidence
title created updated last_synced type namespace tags confidence
reflect-skip Skip Fuse — Pitfalls 2026-05-20 2026-05-22 2026-05-22 reference personal
reflect
skip
swiftui
kotlin
pitfall
0.9

reflect-skip Skip Fuse — Adding a New SwiftUI View

Problem

При добавлении нового SwiftUI View-файла в Sources/ReflectApp/Views/ Skip Fuse не создаёт Kotlin-стаб автоматически. Приложение крашится с ClassNotFoundException при запуске.

Fix — создать Kotlin-стаб вручную

Нужно создать стаб в обоих местах:

  1. DerivedData/.../reflect-skip.output/ReflectApp/skipstone/ReflectApp/src/main/kotlin/reflect/app/
  2. .build/plugins/outputs/reflect-skip/ReflectApp/destination/skipstone/ReflectApp/src/main/kotlin/reflect/app/

Шаблон: скопировать OnboardingView.kt, заменить:

  • Имя класса
  • @State vars

Constructor принимает closure-параметры.

После создания стабов:

skip gradle assembleDebug

Package.swift — обязательная структура

Без этих секций Xcode падает с "Missing package product 'ReflectApp'":

// Package.swift — обязательные поля
dependencies: [
    .package(url: "https://source.skip.tools/skip.git", from: "1.8.9"),
    .package(url: "https://source.skip.tools/skip-fuse.git", from: "1.0.0"),
    .package(url: "https://source.skip.tools/skip-fuse-ui.git", from: "1.0.0"),
],
targets: [
    .target(
        name: "ReflectApp",
        path: "Sources/ReflectApp",
        dependencies: [
            .product(name: "SkipFuse",   package: "skip-fuse"),
            .product(name: "SkipFuseUI", package: "skip-fuse-ui"),
        ],
        plugins: [.plugin(name: "skipstone", package: "skip")]
    )
]

Pitfall: нужны оба: skip-fuse (runtime) + skip-fuse-ui (SwiftUI overlay для Android). Ранее была попытка использовать skip-ui вместо skip-fuse-ui — это неверно, skip-ui не предоставляет SwiftUI модуль для Android-сборки и ломает full build с no such module 'SwiftUI'.

Прочие питфоллы

  • @State private → менять на internal в Kotlin-стабе
  • case none в enum крашит JNI — избегать
  • ViewModifier → инлайнить в тело View
  • PRODUCT_NAME=ReflectApp в Build Settings не менять
  • @AppStorage поля добавлять вручную в Kotlin-стаб

Deploy & Signing

# Build and publish (~15s Gradle):
./build-and-publish.sh

Android signing keystore: ~/.android/signing/nolvu-release.jks (alias: nolvu2026)

Проект

~/Developer/reflect-skip

Связанные страницы