build.gradle.kts我在 KMM 项目的模块中设置了文件shared,如下所示:
android {
namespace = "com.my.project"
compileSdk = 33
sourceSets["main"].manifest.srcFile("src/androidMain/AndroidManifest.xml")
defaultConfig {
minSdk = 24
targetSdk = 33
}
}
Run Code Online (Sandbox Code Playgroud)
对于targetSDK我收到以下警告:
targetSdk: Int?' is deprecated. Will be removed from library DSL in v9.0
Run Code Online (Sandbox Code Playgroud)
如何迁移这部分并targetSdk在我的 KMM 项目中为 Android 项目正确设置版本?
我有一个要求,我希望将不同的数据集与 kotlin 多平台模块生成的库一起提供,以适应不同的风格,例如开发和生产。在Android项目中,我们可以使用应用程序的build.gradle中的productFlavors。
在 Kotlin Multiplatform 中是否有类似的方法可以做到这一点?
我在公共模块中编写了如下公共代码,并在JS环境中进行了测试
val response = client.post<HttpResponse>(url) {
body = TextContent("""{"a":1,"b":2}""", ContentType.Application.Json)
}
if (response.status != HttpStatusCode.OK) {
logger.error("Error, this one failed bad?")
}
Run Code Online (Sandbox Code Playgroud)
但我的代码以 client.post 结尾,在没有网络的情况下出现取消的 corutineException 。我该如何处理这个异常以及任何其他异常?如果有互联网连接。没有任何失败,我希望能够处理异常。如何?
注意:try、catch 不起作用
我想在多平台项目中创建一个类,并用Parcelize它来制作ParcelableAndroid版本.
所以在我的lib-common项目中,我尝试过:
expect annotation class Parcelize()
expect interface Parcelable
@Parcelize
data class Foo(x: Int): Parcelable
Run Code Online (Sandbox Code Playgroud)
在我的lib-android项目中:
actual typealias Parcelize = kotlinx.android.parcel.Parcelize
actual typealias Parcelable = android.os.Parcelable
Run Code Online (Sandbox Code Playgroud)
第一个问题是,摇篮插件kotlin-android-extensions似乎并没有参加lib-android的build.gradle,所以包kotlinx.android.parcel没有被发现.我设法通过直接导入库来解决这个问题:
implementation "org.jetbrains.kotlin:kotlin-android-extensions-runtime:$kotlin_version"
Run Code Online (Sandbox Code Playgroud)
有了这个,编译的actual定义Parcelable.
但是,我从定义中得到一个错误Foo,好像它没有正确注释@Parcelize:
类
Foo不是抽象的,也不实现public abstract fun writeToParcel(p0: Parcel!, p1: Int): Unit在中定义的抽象成员android.os.Parcelable
android parcelable kotlin kotlin-android-extensions kotlin-multiplatform
我正在尝试使用 jvm 和 js 源集运行 kotlin 多平台项目,但出现以下错误:
FAILURE: Build failed with an exception.
* Where:
Initialization script '/private/var/folders/yc/sdfads/T/Home_main__.gradle' line: 20
* What went wrong:
A problem occurred configuring root project 'kotlin-multiplatform'.
> Could not create task ':Home.main()'.
> SourceSet with name 'jvmMain' not found.
Run Code Online (Sandbox Code Playgroud)
Home是一个类src/jvmMain/kotlin/Home.kt并且只有一个main()函数。
我尝试尽可能地遵循文档,我自己的代码并不多。我只是将jvmMain源集设置为依赖commonMain并添加更多的库。我的build.gradle:
plugins {
kotlin("multiplatform") version "1.3.72"
}
kotlin {
jvm()
js().browser()
// android()
sourceSets {
val commonMain by getting {
dependencies {
implementation(kotlin("stdlib-common"))
} …Run Code Online (Sandbox Code Playgroud) 我正在尝试获取并反序列化github上托管的一些数据。
{
"Meals": [
{
"id": "1598044e-5259-11e9-8647-d663bd870b02",
"name": "Tomato pasta",
"quantity": [{
"quantity": 1 },
{
"quantity": 2
},
{
"quantity": 3
}],
"availableFromDate": "1605802429",
"expiryDate": "1905802429",
"info": "Vegetarian",
"hot": false,
"locationLat": 57.508865,
"locationLong": -6.292,
"distance": null
},
{
"id": "2be2d854-a067-43ec-a488-2e69f0f2a624",
"name": "Pizza",
"quantity": [{
"quantity": 1 },
{
"quantity": 2
},
{
"quantity": 3
}
],
"availableFromDate": "1605802429",
"expiryDate": "1905902429",
"info": "Meat",
"hot": false,
"locationLat": 51.509465,
"locationLong": -0.135392,
"distance": null
}
]
}
Run Code Online (Sandbox Code Playgroud)
如果我在本地启动json 服务器,那么它会完美工作,所以我知道我的数据类不是问题。但是,当我尝试从 github …
我正在尝试在共享库中运行测试。
设置(两台机器的版本应该相同 - 截至今天都是最新的):
Kotlin 1.6.21 (tried 1.6.20 and 1.6.10)
OpenJDK 11.0.15 (via Homebrew)
IntelliJ
Build #IC-221.5591.52, built on May 10, 2022
Runtime version: 11.0.14.1+1-b2043.45 aarch64
VM: OpenJDK 64-Bit Server VM by JetBrains s.r.o.
XCode 13.3.1 with command-line tools
macOS BigSur 12.3.1
Run Code Online (Sandbox Code Playgroud)
M1专业版
:cleanIosSimulatorArm64Test :iosSimulatorArm64Test --tests "com.example.shared.ConverterTest" --stacktrace
Run Code Online (Sandbox Code Playgroud)
Intel Core i9(同样的错误,只需将“arm”更改为“x64”)
:cleanIosX64Test :iosX64Test --tests "com.example.shared.ConverterTest"
Run Code Online (Sandbox Code Playgroud)
> Task :linkDebugTestIosSimulatorArm64 FAILED
e: Compilation failed: Unexpected IrType kind: KIND_NOT_SET
* Source files:
* Compiler version info: Konan: 1.6.21 / Kotlin: 1.6.21 …Run Code Online (Sandbox Code Playgroud) 我的 KMP + Jetpack Compose 项目中继续出现 Gradle 配置错误
配置项目“:shared”时出现问题。
未找到名为“testApi”的配置。
我的设置是:
dependencies {
classpath("com.android.tools.build:gradle:7.0.0-alpha03")
classpath("org.jetbrains.kotlin:kotlin-gradle-plugin:1.4.20")
}
Run Code Online (Sandbox Code Playgroud)
import org.jetbrains.kotlin.gradle.plugin.mpp.KotlinNativeTarget
plugins {
kotlin("multiplatform")
id("com.android.library")
}
kotlin {
android()
ios {
binaries {
framework {
baseName = "shared"
}
}
}
sourceSets {
val commonMain by getting
val commonTest by getting {
dependencies {
implementation(kotlin("test-common"))
implementation(kotlin("test-annotations-common"))
}
}
val androidMain by getting {
dependencies {
implementation("com.google.android.material:material:1.2.1")
}
}
val androidTest by getting {
dependencies { …Run Code Online (Sandbox Code Playgroud) 每当我expect在 IntelliJ IDEA 中编写函数时,都会收到以下警告:
The feature "multi platform projects" is experimental and should be enabled explicitly
哪里可以开启这个功能呢?我已经搜索了设置,但没有找到禁用该警告的方法。
使用 gradle 编译效果很好。
当我们使用协程时,我们可以使用普通的 kotlin 协程,也可以使用版本native-mt。
IE
implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-core:1.5.0'
Run Code Online (Sandbox Code Playgroud)
或者
implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-core:1.5.0-native-mt'
Run Code Online (Sandbox Code Playgroud)
他们之间有什么区别吗?我们什么时候应该使用哪个?