我正在尝试将我的 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) 我第一次使用 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++ 代码。我创建了一个 …
在原生 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 模块(如果可能的话)访问。我怎样才能做到这一点?
目前是否可以有一个使用 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) 当尝试使用函数名称旁边的绿色三角形在 IntelliJ IDEA 中运行 Kotlin JVM 模块的主函数时,出现以下错误:
Error: Could not find or load main class MainKt
有没有人以前经历过这个并知道如何解决它?我已经尝试过 Google 上的建议,但似乎不起作用。
我对 Kotlin 和 Kotlin MultiPlatform 以及 Gradle 还很陌生,所以如果您需要更多详细信息,请告诉我。
预先感谢,詹姆斯。
编辑:为了澄清,我可以从命令行运行构建的 .jar 文件,但无法从 IntelliJ 内部运行它而不产生此错误。如果有人可以帮助我调试应用程序,我将非常感激,我只是似乎无法弄清楚:)
是否可以在 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)
这样的事可能吗?如果是的话,语法是什么样的?
我正在尝试将一个库部署到 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
非常感谢任何帮助!
如何检查 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)
}
我遇到了 iOs 应用程序无法通过提供的 ID 获取共享字符串资源的问题。ios 和 kmp 模块位于不同的存储库中
listOf(
iosX64(),
iosArm64(),
iosSimulatorArm64()
).forEach {
it.binaries.framework {
baseName = SHARE_BINARY_NAME
export(libs.moko.shared.resources)
}
}
Run Code Online (Sandbox Code Playgroud)
Strings().get(SharedRes.strings().string_resId)在构建的框架中,我可以看到shared.bundle生成的字符串。
结果我收到异常:
kotlin.IllegalArgumentException: bundle with identifier com.example.shared.MR not found
我设置了 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)
创建项目后我没有对其进行任何更改。