#android #kotlin #kotlin-native
#Android #kotlin #kotlin-native
Вопрос:
Я хотел бы использовать системные функции, такие как getTimeMillis(), которые должны быть частью kotlin.system:https://kotlinlang.org/api/latest/jvm/stdlib/kotlin.system/index.html
Но компилятор говорит, что такой модуль не может быть импортирован. Конфигурация gradle выглядит следующим образом (мультиплатформенный проект kotlin):
commonMain.dependencies {
implementation "org.jetbrains.kotlin:kotlin-stdlib-common:1.3.10"
implementation "org.jetbrains.kotlinx:kotlinx-serialization-runtime:0.10.0"
implementation "io.ktor:ktor-client:1.0.0"
implementation "io.ktor:ktor-client-logging:1.1.0"
implementation "org.jetbrains.kotlinx:kotlinx-coroutines-core-common:1.1.0"
}
Также я не могу найти ни одного примера использования или этого модуля.
Ответ №1:
getTimeMillis()
доступно только для JVM
а Native
не для Common
и JS
.
Если вы не вызовете getTimeMillis()
в исходном каталоге собственного модуля, компилятор сможет найти функцию.
Если вам нужно, чтобы вызов был в Common
вы должны реализовать Common
функцию-оболочку самостоятельно и реализовать оболочку на каждой платформе самостоятельно.
Для этого создайте функцию-заглушку и функцию, которая использует ее в вашем общем модуле. Например:
expect fun getSystemTimeInMillis(): Long
fun printSystemTimeMillis() {
println("System time in millis: ${getSystemTimeInMillis()}")
}
Затем реализуйте эту функцию в модулях, специфичных для вашей платформы. Например, в модуле JVM, таком как:
actual fun getSystemTimeInMillis() = System.currentTimeMillis()
Или в собственном модуле, таком как:
actual fun getSystemTimeInMillis() = getTimeMillis()
Смотрите также:https://github.com/eggeral/kotlin-native-system-package
Комментарии:
1. Я использую getTimeMillis() в машинном коде, и он все еще не может найти метод. :/
2. Я поделился примером, который я использую на github.com/eggeral/kotlin-native-system-package
3. Спасибо, что приложили столько усилий, помогая мне. Я вижу, что ваш проект определен для macOS, я пытаюсь использовать Android и iOS с включенными исходными наборами — возможно, в этом разница.
4. Другими словами, я понимаю, что мне это нужно для общего пользования. Я просто подумал, что «общий» — это «родной».
5. В этом случае вам нужно использовать ‘actual’ и ‘expect’. Я обновил свой ответ и проект Github, чтобы показать, как это сделать.
Ответ №2:
На случай, если сюда попадет кто-нибудь, кто использует kotlin native (как сказано в названии), решение состоит в том, чтобы добавить импорт:
import kotlin.system.getTimeMillis;
Спасибо,