标签: kotlin-multiplatform

别名是带参数的注释

我正在尝试将我的 Android 库转换为 Kotlin 多平台库。

我想保留的一件事是所有针对 Android Lint 的 android 特定注释。我能够通过做一些简单的事情来转换其中的大部分,比如

@MustBeDocumented
@Retention(AnnotationRetention.BINARY)

@Target(
    AnnotationTarget.FUNCTION,
    AnnotationTarget.PROPERTY_GETTER,
    AnnotationTarget.PROPERTY_SETTER,
    AnnotationTarget.CONSTRUCTOR,
    AnnotationTarget.ANNOTATION_CLASS,
    AnnotationTarget.CLASS,
    AnnotationTarget.VALUE_PARAMETER
)
expect annotation class MainThread()

actual typealias MainThread = androidx.annotation.MainThread
Run Code Online (Sandbox Code Playgroud)

这不起作用,RestrictTo因为它需要一个论点。

androidRestrictTo注释看起来像

@Retention(CLASS)
@Target({ANNOTATION_TYPE,TYPE,METHOD,CONSTRUCTOR,FIELD,PACKAGE})
public @interface RestrictTo {

    /**
     * The scope to which usage should be restricted.
     */
    Scope[] value();

    enum Scope {
    }
}
Run Code Online (Sandbox Code Playgroud)

我似乎无法让编译器对值的类型感到满意。

如果我让期望看起来像

@Target(
    AnnotationTarget.FUNCTION,
    AnnotationTarget.PROPERTY_GETTER,
    AnnotationTarget.PROPERTY_SETTER,
    AnnotationTarget.FIELD,
    AnnotationTarget.CONSTRUCTOR,
    AnnotationTarget.ANNOTATION_CLASS,
    AnnotationTarget.CLASS
)
@MustBeDocumented
@Retention(AnnotationRetention.BINARY)
expect annotation class RestrictTo(vararg val value: …
Run Code Online (Sandbox Code Playgroud)

kotlin kotlin-multiplatform

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

从多平台 kotlin 项目访问 C/C++ lib

我第一次使用 Android Studio 构建多平台项目。我创建了一个 Android 应用程序模块,该模块使用 Android 上的多平台库。我还使用 XCode 构建了一个 iOS 应用程序,该应用程序使用 iOS 上的多平台库。一切工作正常,我能够使用由不同的Android 和 iOSexpect fun实现的。actual fun

我还用 C++ 创建了一个公开 C 接口的库。

#ifndef PINGLIB_LIBRARY_H
#define PINGLIB_LIBRARY_H

#ifdef __cplusplus
extern "C" {
#endif

typedef struct {
    long long elapsed;
} PingInfo;

typedef void (*PingCallback)(PingInfo pingInfo);
typedef struct
{
    PingCallback pingUpdate;
} PingObserver;

void* ping(const char * url, const PingCallback *pingCallback);
void subscribe(void* pingOperation);
void unsubscribe(void* pingOperation);

#ifdef __cplusplus
}
#endif

#endif //PINGLIB_LIBRARY_H
Run Code Online (Sandbox Code Playgroud)

我使用 CLion 构建 C++ 代码。我创建了一个 …

c++ android kotlin kotlin-native kotlin-multiplatform

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

在 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
查看次数

Kotlin 多平台 Compose + 桌面 + Web + 移动

目前是否可以有一个使用 compose 的 kotlin 多平台项目来同时共享桌面、Web 和移动设备的 ui 代码?我发现的所有示例仅涵盖带有 JS Front + Jvm Backend 或 JVM Android + Desktop + Common Module 的多平台,并且我在同时使用所有这些设置项目时遇到了麻烦。

我尝试这样做:

plugins {
    kotlin("multiplatform")
    id("org.jetbrains.compose") version "1.0.1-rc2"
    id("com.android.library")
}
kotlin {
    android()
    jvm("desktop") {
       ...
    }
    js{
       ...
    }
    sourceSets {
        val commonMain by getting {
            dependencies {
               ...
            }
        }
        val commonTest by getting {
            dependencies {
               ...
            }
        }
        val androidMain by getting {
            dependencies {
                ...
            }
        }
        val androidTest by getting {
            dependencies { …
Run Code Online (Sandbox Code Playgroud)

kotlin-multiplatform android-jetpack-compose

8
推荐指数
2
解决办法
5655
查看次数

Kotlin 多平台 - “错误:无法找到或加载主类 MainKt”

当尝试使用函数名称旁边的绿色三角形在 IntelliJ IDEA 中运行 Kotlin JVM 模块的主函数时,出现以下错误:

Error: Could not find or load main class MainKt

有没有人以前经历过这个并知道如何解决它?我已经尝试过 Google 上的建议,但似乎不起作用。

我对 Kotlin 和 Kotlin MultiPlatform 以及 Gradle 还很陌生,所以如果您需要更多详细信息,请告诉我。

预先感谢,詹姆斯。

编辑:为了澄清,我可以从命令行运行构建的 .jar 文件,但无法从 IntelliJ 内部运行它而不产生此错误。如果有人可以帮助我调试应用程序,我将非常感激,我只是似乎无法弄清楚:)

intellij-idea kotlin kotlin-multiplatform

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

Kotlin 期望实际数据类型

是否可以在 commonMain 中定义数据类型的期望,然后在 jvmMain 或 jsMain 中提供实际的数据类型?

例如,假设我想在 commonMain 类中使用 JavaScript 和 Java 中日期的本地数据类型:

// commonMain
expect datatype Date

// jsMain
actual datatype Date = Date()

// jvmMain
actual datatype Date = LocalDate()
Run Code Online (Sandbox Code Playgroud)

这样的事可能吗?如果是的话,语法是什么样的?

kotlin kotlin-multiplatform

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

Gradle maven-publish / Sonatype 创建多个无法关闭的存储库

我正在尝试将一个库部署到 Maven Central(我之前已经做过很多次),但在本例中它包含针对不同平台的许多不同出版物。通过插件上传maven-publish可以工作,但我最终在 Sonatype 中得到了多个存储库,每个存储库都包含文件的子集:

在此输入图像描述

因此,我无法关闭存储库,因为某些文件总是丢失(只有所有存储库一起包含通过 Sonatype 验证所需的所有文件)。

Sonatype 文档说:

为用户 ID、IP 地址和用户代理的每个组合创建一个单独的临时存储库。(https://help.sonatype.com/repomanager2/staging-releases/managing-staging-repositories

不过,对于创建的存储库来说,所有三个参数都是相同的,因此它应该创建一个。在本地发布以及从 Github 操作发布时都会发生这种情况。

回购协议在这里: https: //github.com/1gravity/Kotlin-Bloc

这是发布脚本:https://github.com/1gravity/Kotlin-Bloc/blob/master/buildSrc/src/main/kotlin/bloc-publish.gradle.kts

非常感谢任何帮助!

gradle maven kotlin kotlin-multiplatform

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

用于 KMM 中互联网检查的 NetworkUtil

如何检查 KMM 中的互联网可用性(实际/预期)

安卓

actual class NetworkUtils actual constructor() {
    actual fun isNetworkAvailable(): Boolean {
        val connectivityManager =
            application.getSystemService(Context.CONNECTIVITY_SERVICE) as ConnectivityManager
        val networkInfo = connectivityManager.activeNetworkInfo
        return networkInfo != null && networkInfo.isConnected
    }
}
Run Code Online (Sandbox Code Playgroud)

常见的

expect class NetworkUtils() {
    fun isNetworkAvailable(): Boolean
}
Run Code Online (Sandbox Code Playgroud)

IOS


actual class NetworkUtils {
    actual fun isNetworkAvailable(): Boolean {
      //todo ?
        }
Run Code Online (Sandbox Code Playgroud)

}

kotlin-multiplatform

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

未找到带有标识符 MR 的 KMP moko 共享资源 xcframework 捆绑包

我遇到了 iOs 应用程序无法通过提供的 ID 获取共享字符串资源的问题。ios 和 kmp 模块位于不同的存储库中

  1. 我按照lib的README中的配置进行操作。https://github.com/icerockdev/moko-resources。xcframeworks 似乎没有额外的步骤。
  2. 我构建动态(isStatic = false)框架
 listOf(
        iosX64(),
        iosArm64(),
        iosSimulatorArm64()
    ).forEach {
        it.binaries.framework {
            baseName = SHARE_BINARY_NAME
            export(libs.moko.shared.resources)
        }
    }
Run Code Online (Sandbox Code Playgroud)
  1. 在本地,我构建框架 assembleXCFramework
  2. 通过 kmmbridge 插件分发框架
  3. 尝试获取字符串资源(在模拟器上运行): Strings().get(SharedRes.strings().string_resId)

在构建的框架中,我可以看到shared.bundle生成的字符串。

我也可以在生成的文件中看到它们

结果我收到异常: kotlin.IllegalArgumentException: bundle with identifier com.example.shared.MR not found

ios kotlin swift kotlin-multiplatform

7
推荐指数
0
解决办法
495
查看次数

Kotlin 多平台错误:共享:linkDebugFrameworkIosSimulatorArm64

我设置了 KMP 项目,但无法启动 iOS 模拟器。安卓运行完美。当尝试运行 iOS 时,以下 gradle 任务失败:

The /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/ld command returned non-zero exit code: 1.
output:
ld: unknown options: -ios_simulator_version_min -sdk_version 
Run Code Online (Sandbox Code Playgroud)

创建项目后我没有对其进行任何更改。

android ios kotlin kotlin-multiplatform

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