我正在尝试构建一个简单的 Kotlin 多平台应用程序,该应用程序调用互联网以使用 ktor 从互联网获取一些字符串。我从Kotlin 会议应用程序中获取了一些我编译的功能,它在 Android 和 iOS 上都运行良好。
但是,在我的示例应用程序中,它仅适用于 Android,但在 iOS 上它会返回
kotlin.native.concurrent.InvalidMutabilityException: mutation attempt of frozen <object>@c422ffe8
这是GitHub 存储库,下面是我的代码:
// src/commonMain/CoroutinePresenter.kt
open class CoroutinePresenter(
private val mainContext: CoroutineContext, // TODO: Use Dispatchers.Main instead when it will be supported on iOS
private val baseView: BaseView
): CoroutineScope {
private val job = Job()
private val exceptionHandler = CoroutineExceptionHandler { _, throwable ->
baseView.showError(throwable)
}
override val coroutineContext: CoroutineContext
get() = mainContext + job + …Run Code Online (Sandbox Code Playgroud) 这是一个简单的脚本
fun main() {
print("ready> ")
val input = readLine()
println("User input: $input")
}
Run Code Online (Sandbox Code Playgroud)
当我运行这个程序时,gradle runReleaseExecutableMacos我希望我会看到一个ready>提示,并且有可能输入一些字符。但这个程序User input: null结果立即结束。
我错过了什么吗?
如何在 Kotlin/Native 中使用 Swift 库?
我正在尝试使用 cinteropt 来使用 Objective-c 库,Kotlin/Native但我似乎无法弄清楚如何使用 swift 库?
有人可以在这里指导我吗?提前致谢。
我使用的是 Kotlin 1.5.10 和 ktor 1.6.0。
当我执行网络提取时
private suspend fun getHello(): Model.Result {
return httpClient.get("https://en.wikipedia.org/w/api.php?action=query&format=json&list=search&srsearch=multiplatform")
}
Run Code Online (Sandbox Code Playgroud)
使用数据模型
object Model {
@Serializable
data class Result(val query: Query)
@Serializable
data class Query(val searchinfo: SearchInfo)
@Serializable
data class SearchInfo(val totalhits: Int)
}
Run Code Online (Sandbox Code Playgroud)
Android 版本编译良好并响应
Result(query=Query(searchInfo=SearchInfo(totalhits=707)))
Run Code Online (Sandbox Code Playgroud)
但是,当我在 iOS 中编译它时,它返回崩溃
RESPONSE https://en.wikipedia.org/w/api.php?action=query&format=json&list=search&srsearch=multiplatform failed with exception:
kotlin.native.concurrent.InvalidMutabilityException: mutation attempt of frozen kotlin.collections.HashMap@2566888
Run Code Online (Sandbox Code Playgroud)
这个StackOverflow建议下载到1.3.10,但我不能这样做,因为 KMM 不会在我最新的 Android Studio 4.2.1 中编译。此外,我不将协程用于 commonMain 代码(仅在 Android 代码中)。
这个StackOverflow状态问题与Kodein,但我不使用Kodein。
kotlin ktor kotlin-native kotlin-multiplatform kotlin-multiplatform-mobile
在我的应用程序中,我有两个类,一个继承自 kotlin 类的 swift 类:
迅捷类:
public class MySensor: RawSensor
[...]
public override func notifyChanged(values: KotlinFloatArray) {
super.notifyChanged(values: values)
}
}
Run Code Online (Sandbox Code Playgroud)
科特林类:
package com.mycompany.myapp.mypackage.sensors.rawsensors
import com.mycompany.myapp.mypackage.util.Observable
abstract class RawSensor : Observable() {
protected abstract val sensorDataType: RawSensorData.SensorDataType
abstract val currentTime: Long
protected open fun notifyChanged(values: FloatArray) {
notifyObservers(RawSensorData(values, sensorDataType, currentTime))
}
abstract fun start()
abstract fun stop()
}
Run Code Online (Sandbox Code Playgroud)
当super.notifyChanged(values: values)被调用时,应用程序崩溃,并出现以下错误:
Uncaught Kotlin exception: kotlin.native.IncorrectDereferenceException: illegal attempt to access non-shared <object>@83cb47c8 from other thread
Uncaught Kotlin exception: kotlin.native.IncorrectDereferenceException: illegal …Run Code Online (Sandbox Code Playgroud) 我们目前如何从 swift收集Flow?
通过在 Swift流的collect方法中对 Kotlin 的挂起函数的新支持,可以在 swift 中获得这个相当笨重的签名
vm.topStoriesFlow.collect(
collector: Kotlinx_coroutines_coreFlowCollector,
completionHandler: @escaping (KotlinUnit?, Error?) -> Void
)
Run Code Online (Sandbox Code Playgroud)
知道如何使用它,或者即使当前支持它的使用吗?
kotlin kotlin-native kotlin-multiplatform kotlin-coroutines kotlin-flow
我正在尝试将一些业务逻辑从我的 iOS 应用程序转移到 KMM。当突然开始在工作室遇到问题时,我已经做了一些工作。它没有构建,有奇怪的metaspace错误等。老实说,我在我的项目周围跳动了几个小时和几天 - 没有结果。我决定完全卸载工作室及其所有相关文件。
在那之后,我什至无法正确构建一个空的 KMM 项目。简单的 Android 项目工作得很好。只有 KMM 才会出现问题。当我第一次创建项目时,它已成功加载,下载所有依赖项并同步。我能够看到“Android”项目结构。我试图通过./gradlew build- 错误来构建它。没有完整的描述,只有失败任务的名称 - compile kotlin to ios arm64。一个全新项目中的错误。我尝试重建项目 - 没有运气。所以我重新启动了工作室,魔法的第二部分开始了。
从这一刻起,每当我打开一个新的或现有的 KMM 项目时,它就会开始同步并卡住。例如,我无法打开项目结构,因为同步正在进行,我无法添加依赖项,因为同步正在进行。但是我可以通过./gradlew build它来构建它并且它会构建!好吧,我尝试了更多命令,例如./gradlew -refresh-dependencies等。它构建成功。然后在某个时候所有的代码都变成了红色。下面你可以同时看到Android Studio的所有颜色:
在终端中,您可以看到它已成功构建。在右下角,您可以看到它不允许进入项目结构,因为正在进行同步。最美丽的是所有未解决的符号。
我相信我已经尝试了大部分 Android Studio 的东西:
./gradlew clean build伙计们,您有什么想法可以让工作室只与 KMM 一起工作吗?然后我应该如何让它继续工作?正如我已经说过的,问题不是特定于工作室的,而是特定于 KMM 的,因为常规的 android 项目构建得很好。
安卓工作室 4.1.2
Mac OS 大苏尔 11.2
Kotlin 1.4.30-release-Studio4.1-1
android kotlin android-studio kotlin-native kotlin-multiplatform
我正在尝试制作一个可在 Android、JavaScript 和 iOS 中使用的 Kotlin 多平台库。该库由多个模块组成,因此可以轻松扩展。我现在的问题只与 Kotlin 原生有关。
:commonobject MySingleton {
fun doSomethingWithMyInterface(value: MyInterface) {
// ...
}
}
interface MyInterface {
fun doSomething()
}
Run Code Online (Sandbox Code Playgroud)
MyInterfaceclass MyInterfaceExample : MyInterface {
override fun doSomething() {
// ...
}
}
Run Code Online (Sandbox Code Playgroud)
我已将build.gradle.kts文件设置:common如下:
plugins {
kotlin("multiplatform")
kotlin("native.cocoapods")
id("maven-publish")
}
kotlin {
targets {
jvm()
js().browser()
ios("ios") {
binaries {
framework("CommonModule") {
baseName = "common"
}
}
}
}
cocoapods {
frameworkName = "CommonModule"
summary …Run Code Online (Sandbox Code Playgroud) 我对 Kotlin 非常陌生,并且在 Windows 上使用 Kotlin/Native 制作命令行 .exe。应用程序应从文本文件中读取并逐行打印在屏幕上。当它到达文件的最后一行时,应该将其放入剪贴板。
aFile.txt看起来像这样:
one
two
three
...
...
the last line
Run Code Online (Sandbox Code Playgroud)
到目前为止我的代码read.kt(Kotlin/Native)是这样的:
import kotlinx.cinterop.*
import platform.posix.*
fun main(args: Array<String>) {
if (args.size != 1) {
println("Usage: read.exe <file.txt>")
return
}
val fileName = args[0]
val file = fopen(fileName, "r")
if (file == null) {
perror("cannot open input file $fileName")
return
}
try {
memScoped {
val bufferLength = 64 * 1024
val buffer = allocArray<ByteVar>(bufferLength)
do {
val nextLine = fgets(buffer, …Run Code Online (Sandbox Code Playgroud) 我找不到任何有关如何在 Kotlin Multiplatform 中获取 CPointer 的示例,并且现有文档也没有多大帮助。在我的 iOS 源代码集中,我需要构建与以下 Swift 代码等效的 Kotlin(仅包括代码的相关部分):
...(hex: String) {
if hex.hasPrefix("#") {
let start = hex.index(hex.startIndex, offsetBy: 1)
let scanner = Scanner(string: hexColor)
var hexNumber: UInt64 = 0
if scanner.scanHexInt64(&hexNumber) {
r = CGFloat((hexNumber & 0xff000000) >> 24) / 255
....
Run Code Online (Sandbox Code Playgroud)
我遇到问题的具体部分是
扫描仪.scanHexInt64(&hexNumber)
这是 Kotlin 代码和问题
//input to function - hex: String
val scanner = NSScanner(hex)
if (hex.startsWith("#")) {
scanner.scanLocation = 1u
}
var hexNumber : UInt32 = 0u
/*Type mismatch.
Required:
CPointer<UIntVar /* = …Run Code Online (Sandbox Code Playgroud) kotlin-native ×10
kotlin ×9
ios ×2
ktor ×2
swift ×2
android ×1
c ×1
clipboard ×1
kotlin-flow ×1