【问题标题】:Unresolved reference: squareup in iosMain directory after adding dependencies未解决的参考:添加依赖项后 iosMain 目录中的 squareup
【发布时间】:2021-11-05 23:49:57
【问题描述】:

我正在尝试在适用于 Android 和 iOS 的 Kotlin 多平台项目中使用 SQLDelight。我遵循了找到here 的文档。该项目成功构建,但我无法访问 com.squareup.* shared/iosMain 文件夹内的任何位置。以下是我的代码文件。

项目/build.gradle.kts:

buildscript {
    repositories {
        gradlePluginPortal()
        google()
        mavenCentral()
    }
    dependencies {
        classpath("org.jetbrains.kotlin:kotlin-gradle-plugin:1.5.31")
        classpath("com.android.tools.build:gradle:7.0.3")
        classpath("com.squareup.sqldelight:gradle-plugin:1.5.2")

    }
}

allprojects {
    repositories {
        google()
        mavenCentral()
    }
}

tasks.register("clean", Delete::class) {
    delete(rootProject.buildDir)
}

项目/shared/build.gradle.kts:

import org.jetbrains.kotlin.gradle.plugin.mpp.KotlinNativeTarget

plugins {
    kotlin("multiplatform")
    kotlin("native.cocoapods")
    id("com.android.library")
    id("com.squareup.sqldelight")

}

version = "1.0"

kotlin {
    android()

    val iosTarget: (String, KotlinNativeTarget.() -> Unit) -> KotlinNativeTarget = when {
        System.getenv("SDK_NAME")?.startsWith("iphoneos") == true -> ::iosArm64
        System.getenv("NATIVE_ARCH")?.startsWith("arm") == true -> ::iosSimulatorArm64
        else -> ::iosX64
    }

    iosTarget("ios") {}

    cocoapods {
        summary = "Some description for the Shared Module"
        homepage = "Link to the Shared Module homepage"
        ios.deploymentTarget = "14.1"
        frameworkName = "shared"
        podfile = project.file("../iosApp/Podfile")
    }
    
    sourceSets {
        val commonMain by getting {
            dependencies {
                // SQLDelight
                implementation("com.squareup.sqldelight:runtime:1.5.2")
                implementation ("com.squareup.sqldelight:coroutines-extensions:1.5.0")
            }
        }
        val commonTest by getting {
            dependencies {
                implementation(kotlin("test-common"))
                implementation(kotlin("test-annotations-common"))
            }
        }
        val androidMain by getting {
            dependencies {
                implementation("com.squareup.sqldelight:android-driver:1.5.0")

            }
        }
        val androidTest by getting {
            dependencies {
                implementation(kotlin("test-junit"))
                implementation("junit:junit:4.13.2")
            }
        }
        val iosMain by getting {
            dependencies {
                implementation("com.squareup.sqldelight:native-driver:1.5.2")
            }
        }
        val iosTest by getting
    }
}

sqldelight {
    database("AppDatabase") {
        packageName = "com.example.sam.data.db"
        dialect = "sqlite:3.25"
    }
}

android {
    compileSdkVersion(31)
    sourceSets["main"].manifest.srcFile("src/androidMain/AndroidManifest.xml")
    defaultConfig {
        minSdkVersion(21)
        targetSdkVersion(31)
    }
}

Project/shared/src/commonMain/kotlin/com/example/sam/data/db/DatabaseDriverFactory.kt

package com.example.sam.data.db

import com.squareup.sqldelight.db.SqlDriver

expect class DatabaseDriverFactory {
    fun createDriver(): SqlDriver
}

Project/shared/src/androidMain/kotlin/com/example/sam/data/db/DatabaseDriverFactory.kt

package com.example.sam.data.db

import android.content.Context
import com.squareup.sqldelight.android.AndroidSqliteDriver
import com.squareup.sqldelight.db.SqlDriver

actual class DatabaseDriverFactory(
    private val ctx: Context
) {

    actual fun createDriver(): SqlDriver {
        return AndroidSqliteDriver(AppDatabase.Schema, ctx, "app.db")
    }

}

我遇到问题的文件 - Project/shared/iosMain/kotlin/com/example/sam/data/db/DatabaseDriverFactory.kt

package com.example.sam.data.db

import com.squareup.sqldelight.db.SqlDriver
import com.squareup.sqldelight.drivers.native.NativeSqliteDriver


actual class DatabaseDriverFactory {

    actual fun createDriver(): SqlDriver {
        return NativeSqliteDriver(AppDatabase.Schema, "app.db")
    }

}

找不到 SqlDriver、NativeSqliteDriver 甚至 com.squareup.*。

我搜索了网络,但没有找到任何有用的东西。

【问题讨论】:

  • 第一个问题是它是否只是一个 IDE 问题,或者构建是否也不起作用。接下来,您使用的是哪个版本的 Kotlin?你在用enableDependencyPropagation吗?假设 gradle 构建工作但 IDE 无法识别依赖项,您通常只需要使用 Kotlin、库和 IDE 的最新稳定版本。
  • 嗨@KevinGalligan,我不知道这是否是IDE问题,但我使用的是最新版本的android studio;该项目也成功构建,但未运行。我没有使用 enableDependencyPropagation,而是使用了最新的稳定版 kotlin。谢谢。
  • 我不知道你所说的它构建但不运行是什么意思。我们应该将 Android Studio 问题与 Kotlin 问题分开,因为工作室配置仍然很脆弱(Kotlin 团队和 Android 团队并不总是完美同步)。我会在 Xcode 中打开项目并尝试从那里实际运行它,而不是 Android Studio。
  • 如果你在项目的根目录下运行./gradlew :shared:clean :shared:build会发生什么?它编译吗?如果是,那就是 IDE 问题,如果不是,那就是另外一回事了。从我的角度来看,您发布的代码看起来是正确的。

标签: android ios kotlin kotlin-multiplatform sqldelight


【解决方案1】:

评论不允许我发布代码,但我想尝试一些事情。

试试这个配置,看看 IDE 是否能更好地理解它。您仍然需要添加某种形式的更复杂的形式,但我想尽可能减少变量。

kotlin {
    android()

    iosX64("ios")

    cocoapods {
    //etc...

【讨论】:

  • 嗨@KevinGalligan,我遇到的问题与this question 相同,但您的回答对我不起作用。
  • 好的。你需要更多的细节。我没有任何其他猜测。
  • 请让我知道还有哪些其他细节会有所帮助,我已经发布了我的 gradle 文件和问题中的示例代码。我真的被困住了。
猜你喜欢
  • 2021-09-29
  • 2021-04-02
  • 1970-01-01
  • 2021-12-16
  • 2015-08-06
  • 2019-06-18
  • 1970-01-01
  • 2023-02-16
  • 2017-05-20
相关资源
最近更新 更多