사용자 인터페이스 업데이트
이 튜토리얼은 IntelliJ IDEA를 사용하지만, Android Studio에서도 따라 할 수 있습니다. 두 IDE 모두 동일한 핵심 기능과 Kotlin Multiplatform 지원을 공유합니다.
이것은 공유 로직과 네이티브 UI로 Kotlin Multiplatform 앱 만들기 튜토리얼의 두 번째 파트입니다. 계속하기 전에 이전 단계를 완료했는지 확인하세요.
사용자 인터페이스를 구축하려면 프로젝트의 Android 부분에는 Compose Multiplatform 툴킷을, iOS 부분에는 SwiftUI를 사용합니다. 이 둘은 모두 선언형 UI 프레임워크이며, UI 구현에서 유사점을 발견할 수 있을 것입니다. 두 경우 모두 phrases
변수에 데이터를 저장하고, 나중에 이 데이터를 반복하여 Text
항목 목록을 생성합니다.
Android 부분 업데이트
composeApp
모듈은 Android 애플리케이션을 포함하고, 해당 메인 액티비티와 UI 뷰를 정의하며, shared
모듈을 일반 Android 라이브러리로 사용합니다. 애플리케이션의 UI는 Compose Multiplatform 프레임워크를 사용합니다.
몇 가지 변경 사항을 적용하고 UI에 어떻게 반영되는지 확인해 보세요:
composeApp/src/androidMain/kotlin
경로의App.kt
파일로 이동합니다.Greeting
클래스 호출을 찾습니다.greet()
함수를 선택하고 마우스 오른쪽 버튼을 클릭한 다음 Go To | Declaration or Usages를 선택합니다. 이것이 이전 단계에서 편집했던shared
모듈의 동일한 클래스임을 알 수 있습니다.Greeting.kt
파일에서greet()
함수를 업데이트합니다:kotlinimport kotlin.random.Random fun greet(): List<String> = buildList { add(if (Random.nextBoolean()) "Hi!" else "Hello!") add("Guess what this is! > ${platform.name.reversed()}!") }
이제 문자열 목록을 반환합니다.
App.kt
파일로 돌아가서App()
구현을 업데이트합니다:kotlin@Composable @Preview fun App() { MaterialTheme { val greeting = remember { Greeting().greet() } Column( modifier = Modifier .padding(all = 10.dp) .safeContentPadding() .fillMaxSize(), verticalArrangement = Arrangement.spacedBy(8.dp), ) { greeting.forEach { greeting -> Text(greeting) HorizontalDivider() } } } }
여기서
Column
컴포저블(composable)은 각Text
항목을 표시하며, 주변에 패딩을 추가하고 항목들 사이에 공간을 둡니다.IntelliJ IDEA의 제안에 따라 누락된 종속성을 임포트합니다.
이제 Android 앱을 실행하여 문자열 목록이 어떻게 표시되는지 확인할 수 있습니다:
iOS 모듈 작업
iosApp
디렉터리는 iOS 애플리케이션으로 빌드됩니다. 이 디렉터리는 shared
모듈을 iOS 프레임워크로 의존하고 사용합니다. 앱의 UI는 Swift로 작성되었습니다.
Android 앱에서와 동일한 변경 사항을 구현합니다:
IntelliJ IDEA에서 Project 툴 창에서 프로젝트 루트에 있는
iosApp
폴더를 찾습니다.ContentView.swift
파일을 열고,Greeting().greet()
호출을 마우스 오른쪽 버튼으로 클릭한 다음 Go To | Definition을 선택합니다.shared
모듈에 정의된 Kotlin 함수의 Objective-C 선언을 볼 수 있습니다. Kotlin 타입은 Objective-C/Swift에서 사용될 때 Objective-C 타입으로 표현됩니다. 여기서greet()
함수는 Kotlin에서는List<String>
을 반환하고, Swift에서는NSArray<NSString>
을 반환하는 것으로 보입니다. 타입 매핑에 대한 자세한 내용은 Swift/Objective-C와의 상호 운용성(Interoperability)을 참조하세요.Android 앱과 동일한 방식으로 항목 목록을 표시하도록 SwiftUI 코드를 업데이트합니다:
Swiftstruct ContentView: View { let phrases = Greeting().greet() var body: some View { List(phrases, id: \.self) { Text($0) } } }
greet()
호출 결과는phrases
변수에 저장됩니다 (Swift의let
은 Kotlin의val
과 유사합니다).List
함수는Text
항목 목록을 생성합니다.
변경 사항을 확인하려면 iOS 실행 구성을 시작합니다:
발생 가능한 문제 및 해결책
Xcode가 공유 프레임워크를 호출하는 코드에서 오류를 보고하는 경우
Xcode를 사용하는 경우, Xcode 프로젝트가 여전히 이전 버전의 프레임워크를 사용하고 있을 수 있습니다. 이 문제를 해결하려면 IntelliJ IDEA로 돌아가 프로젝트를 재빌드하거나 iOS 실행 구성을 시작하세요.
Xcode가 공유 프레임워크 임포트 시 오류를 보고하는 경우
Xcode를 사용하는 경우, 캐시된 바이너리를 지워야 할 수 있습니다. 메인 메뉴에서 Product | Clean Build Folder를 선택하여 환경을 초기화해 보세요.
다음 단계
튜토리얼의 다음 부분에서는 종속성(dependencies)에 대해 배우고, 프로젝트의 기능을 확장하기 위해 서드 파티 라이브러리를 추가할 것입니다.
도움 받기
- Kotlin Slack. 초대장을 받아 #multiplatform 채널에 참여하세요.
- Kotlin 이슈 트래커. 새로운 이슈 보고.