标签: kmm

任务“:shared:podInstall”执行失败

我对 KMM(Kotlin Multiplatform Mobile)和 iOS 开发(包括 CocoaPods)非常陌生。我在 Android Studio 中遇到以下构建错误。

任务“:shared:podInstall”执行失败。java.io.IOException:无法运行程序“pod”(在目录“/Users/.../AndroidStudioProjects/.../iosApp”中):错误=2,没有这样的文件或目录

该目录确实存在,并且我似乎能够从该目录中手动运行 pod 命令。我不确定,但是当我将 Kotlin 插件从 1.5.0 更新到 1.5.10 时,似乎出现了这个问题。即使启动全新的 KMM 项目也会出现此问题。

我认为这可能与 Android Studio 无法找到 pod 命令有关,因此我将其添加到路径中,但这似乎没有做任何事情。任何对此的帮助将不胜感激。

android ios cocoapods android-studio kmm

11
推荐指数
2
解决办法
4340
查看次数

在 KMM 中使用 firebase-bom 依赖项时,为什么会出现“未解析的引用:平台”

当我尝试在 Kotlin Multiplatform Mobile (KMM) 项目的共享模块中使用以下块添加 Firebase-bom 依赖项时,该词platform出现在红色错误文本中,并且 Gradle 构建失败并显示“未解析的引用:平台”。我该如何解决这个问题以便正确构建?

        val androidMain by getting {
            dependencies {
                implementation(platform("com.google.firebase:firebase-bom:28.0.1"))
                implementation("com.google.firebase:firebase-analytics-ktx")
            }
        }
Run Code Online (Sandbox Code Playgroud)

kotlin firebase build.gradle gradle-kotlin-dsl kmm

9
推荐指数
1
解决办法
1613
查看次数

KMM 项目:预期的类在 JVM 模块中没有实际声明

expect我有一个运行完美的 KMM 项目,除了 Android Studio在我的项目中的每个函数/值上给出错误,抱怨actualJVM 不存在该版本。

在此输入图像描述

旁边的黄色菱形中的 A 显示了 iOS 和 Android 的实际版本,并且该项目构建/运行得很好。

在此输入图像描述

我已经仔细检查了包名称,expect无论包如何,每个包都会发生这种情况。

我检查了我的 gradle 构建文件,将它们与新的 KMM 示例项目进行比较时找不到任何奇怪的东西。

plugins {
    kotlin("multiplatform")
    kotlin("native.cocoapods")
    id("com.android.library")
    id("com.rickclephas.kmp.nativecoroutines") version "0.12.2-new-mm"
}

version = "1.0"

kotlin {
    android()
    iosX64()
    iosArm64()
    //iosSimulatorArm64() sure all ios dependencies support this target

    cocoapods {
        summary = "Some description for the Shared Module"
        homepage = "Link to the Shared Module homepage"
        ios.deploymentTarget = "15.0"
        podfile = project.file("../iosApp/Podfile")
        framework {
            baseName = "shared"
        }
    } …
Run Code Online (Sandbox Code Playgroud)

intellij-idea android-studio gradle-kotlin-dsl kotlin-multiplatform kmm

9
推荐指数
1
解决办法
2238
查看次数

在 KMM 中定义全局配置变量

在原生 android 项目中,我们可以定义 BuildConfig 变量,这些变量可以根据所选的构建类型(调试或发布)进行更改。为此,我们可以在应用程序级 gradle 文件中添加以下代码

buildTypes {
    release {
        buildConfigField 'String', "BASE_URL", '"https://stackoverflow.com/"'
    }
    debug {
        buildConfigField 'String', "BASE_URL", '"https://qa.stackoverflow.com/"'
    }
}
Run Code Online (Sandbox Code Playgroud)

我期待创建这样的全局配置变量,可以从共享模块以及 Android 和 iOS 模块(如果可能的话)访问。我怎样才能做到这一点?

gradle-kotlin-dsl kotlin-multiplatform kmm

8
推荐指数
1
解决办法
2685
查看次数

KMM 与公共(共享)模块中的 Java 源

由于平台限制,我们无法将 Java 源代码与 Kotlin Multiplatform Mobile 一起使用。

但如果 Kotlin 与 Java 100% 兼容,为什么我们不能将 Java 与 Kotlin Multiplatform Mobile 一起使用呢?我的意思是不仅在 Android 或 JVM 部分使用它,而且在共享代码的公共部分使用它。我们可以用 Java 编写 iOS 应用程序:)

java kotlin kotlin-multiplatform kmm kotlin-multiplatform-mobile

7
推荐指数
1
解决办法
2304
查看次数

将 Ktor 添加到 Kotlin Multiplatform Mobile 导致未解析的参考:HttpClient

我无法让 Ktor 在 KMM 项目中工作,我只是Unresolved reference: HttpClient在尝试引用任何 Ktor 类时收到错误。如果我尝试手动添加 ktor 导入,它会显示Unresolved reference io. 其他依赖项(如Kermit解析良好)似乎只是 Ktor 存在问题。这是我重现的简单步骤:

在此输入图像描述

  1. 在 Android Studio 中(我尝试过 4.1.3 和 4.2 Beta 6),我转到文件 -> 新建 -> KMM 应用程序。

  2. 在共享模块 build.gradle.kts 中,我添加了 ktor 客户端的依赖项:

val commonMain by getting {
        dependencies {
            implementation("io.ktor:ktor-client-core:1.5.2")
        }
     }
Run Code Online (Sandbox Code Playgroud)
  1. 在commonMain 的类中,我尝试创建一个 HttpClient,就像 Ktor 文档https://kotlinlang.org/docs/mobile/use-ktor-for-networking.html#select-an-engineGreeting中所述:
class Greeting {
    val httpClient: HttpClient = HttpClient()

    fun greeting(): String {
        return "Hello, ${Platform().platform}!"
    }
}
Run Code Online (Sandbox Code Playgroud)

我明白了Unresolved reference: HttpClient …

android gradle android-studio ktor kmm

6
推荐指数
1
解决办法
3035
查看次数

作为 Gradle 项目集成到 Android 应用程序中时,KMM 项目上缺少公共类

我有一个现有的 Android 应用程序,我喜欢将 KMM 库项目集成为 git 子模块。我们希望在本地构建上集成 git 子模块,并在 CI 构建上使用 Maven 存储库依赖项。

settings.gradle为了实现这一点,我在via中添加了子模块的目录includeBuild,并替换了特定模块的所有依赖项:

includeBuild('my-kmm-library-project') {
    dependencySubstitution {
        substitute module('com.example.any-kmm-artifact:any') using project(':any')
    }
}
Run Code Online (Sandbox Code Playgroud)

添加

implementation 'com.example.any-kmm-artifact:any:1.0.0'
Run Code Online (Sandbox Code Playgroud)

我的应用程序build.gradle文件允许访问 android 源集中子模块中的所有类和包/my-kmm-library-project/any/src/androidMain。但我无法选择从源集中导入“类” commonMain。我已经尝试让androidMain依赖commonMain.

kmm/build.gradle.kts:

includeBuild('my-kmm-library-project') {
    dependencySubstitution {
        substitute module('com.example.any-kmm-artifact:any') using project(':any')
    }
}
Run Code Online (Sandbox Code Playgroud)

这不会带来任何成功。

我还尝试jvm()在 KMM 项目上添加一个目标并让jvmMain依赖androidMain,但这会产生编译错误,导致 Android SDK 类无法解析。

我认为主要问题是,这些类只是编译到可以组装的aar中。但该模块被集成为 gradle 项目实现。

是否有 KMM 选项来编译“公共类”并通过 gradle 模块访问它们?

android gradle git-submodules kotlin-multiplatform kmm

6
推荐指数
0
解决办法
1043
查看次数

SQLDelight 和 Kotlin 中具有一对多关系的数据类

我正在尝试使用 Kotlin Multiplatform 创建一个小型应用程序,在其中我可以保存书名及其作者,但我正在努力解决数据类以及如何将它们映射在一起,以便我获得作者及其所有书籍和发布日期。

CREATE TABLE book(
id INTEGER NOT NULL,
name TEXT NOT NULL,
publishDate INTEGER NOT NULL,
authorId INTEGER NOT NULL
)

CREATE TABLE author(
id INTEGER NOT NULL,
name TEXT NOT NULL
)
Run Code Online (Sandbox Code Playgroud)

这是我的数据类:

@Serializable
data class bookEntity(
  id: Int,
  name: String,
  authorId: Int
)

@Serializable
data class authorEntity(
  id: Int,
  authorName: String
  books: List<bookEntity>
)
Run Code Online (Sandbox Code Playgroud)

和我的查询:

selectAuthors:
SELECT * FROM author
JOIN book ON book.authorId = author.id
WHERE book.authorId = author.id
Run Code Online (Sandbox Code Playgroud)

我尝试了以下映射,但它不起作用:

private fun mapAuthor(
  id: …
Run Code Online (Sandbox Code Playgroud)

android kotlin data-class sqldelight kmm

6
推荐指数
1
解决办法
1246
查看次数

我们如何观察对 SQLDeLight DB 所做的特定更改并发出它们?

这是我的表结构

CREATE TABLE Missions(
    MissionID INTEGER NOT NULL UNIQUE,
    MilestoneID INTEGER NOT NULL,
    MissionExpiry TEXT,
    MissionStatus TEXT,
    Count INTEGER DEFAULT 0,
    MilestoneList TEXT,
    UpdatedTime TEXT,

    PRIMARY KEY (MissionID),
    CONSTRAINT fk_milestone FOREIGN KEY(MilestoneID)  REFERENCES Milestone(MilestoneID)
);
Run Code Online (Sandbox Code Playgroud)

我想每当上表中的计数属性更新时发出一个事件。

我写了一个这样的查询:

Val allItems: Flow<List<Item>> =
ItemQueries.selectAll().asFlow().mapToList()
Run Code Online (Sandbox Code Playgroud)

但是,每当表内的任何属性发生插入或更新并且所有行都被获取时,流程就会被触发。我只想获取已更新的行而不是所有行。我怎样才能完成它?

kotlin sqldelight kotlin-coroutines kmm

6
推荐指数
0
解决办法
634
查看次数

无法在 kotlin 多平台中访问预期的类构造函数参数

我目前正在使用 kotlin 开发一个多平台模块。为此,我依赖expect/actual机制

我声明了一个简单的类Common.kt

expect class Bar constructor(
    name: String
)
Run Code Online (Sandbox Code Playgroud)

我想在通用方法中使用定义的类(也存在于 中Common.kt):

fun hello(bar: Bar) {
    print("Hello, my name is ${bar.name}")
}
Run Code Online (Sandbox Code Playgroud)

实际实现定义在Jvm.kt

actual data class Bar actual constructor(
    val name: String    
)
Run Code Online (Sandbox Code Playgroud)

问题是我的hello函数中出现以下错误

未解决的参考:名称

我究竟做错了什么?

kotlin kotlin-multiplatform kmm

5
推荐指数
1
解决办法
1356
查看次数