我使用科特林多平台(JVM和JS),这在IDEA创建三个项目:demo,demo-js和demo-jvm.
我想将公共代码拆分为更多子项目/子模块.让我们说我补充commonmod; 我如何编译?
现在的错误gradle run -p demo-jvm是:
demo/demo-js/src/main/kotlin/demo/commonmod/example.kt: (3, 12): Actual function 'getPlatform' has no corresponding expected declaration
Run Code Online (Sandbox Code Playgroud)
但我认为我这样做根本就是错误的,因为我不知道应该依赖什么(虽然我尝试过一些迭代).如果我解决了这个错误,我会得到其他的,然后是其他的,直到我回到这个.
作为一个最小但仍然很大的例子,我有:
demo/settings.gradle:
rootProject.name = 'demo'
include 'demo-jvm', 'demo-js', 'commonmod'
Run Code Online (Sandbox Code Playgroud)
demo/build.gradle:
buildscript { ... }
apply plugin: 'kotlin-platform-common'
repositories {
mavenCentral()
}
dependencies {
compile "org.jetbrains.kotlin:kotlin-stdlib-common:$kotlin_version"
testCompile "org.jetbrains.kotlin:kotlin-test-annotations-common:$kotlin_version"
testCompile "org.jetbrains.kotlin:kotlin-test-common:$kotlin_version"
compile project(':commonmod')
}
Run Code Online (Sandbox Code Playgroud)
demo/demo-jvm/settings.gradle:
rootProject.name = 'demo'
Run Code Online (Sandbox Code Playgroud)
demo/demo-jvm/build.gradle:
buildscript { ... }
apply plugin: 'kotlin-platform-jvm'
apply …Run Code Online (Sandbox Code Playgroud) 我正在尝试实现一个观察者,以更改 UserDefaults 中给定键的值,该值来自用 Kotlin/Native 编写的多平台项目的 ios 本机部分。这是我写的代码:
fun subscribeForDataChange(storeName: String, callback: () -> Unit) {
NSUserDefaults(storeName).addObserver(
object : NSObject() {
fun observeValue(
observer: NSObject,
forKeyPath: String,
options: NSKeyValueObservingOptions,
context: COpaquePointer?
) {
callback()
print("Data Changed!!!")
}
},
options = NSKeyValueObservingOptionNew,
forKeyPath = DATA_KEY,
context = null
)
}
Run Code Online (Sandbox Code Playgroud)
问题是我从来没有收到通知,很可能是因为observeValueNSObject 中没有定义,但是我还应该做什么才能实现这一点?
我正在开发一个 Kotlin/Native 应用程序,我想通过 Gradle 向它传递参数。有类似的任务runDebugExecutableNative。有没有办法做类似的事情:
./gradlew runDebugExecutableNative --args='myFirstArg mySecondArg'
我已按照KMM 实践教程了解如何使用 KMM 构建示例应用程序,并且能够成功完成所有步骤!(Yu-huu!)现在我正在尝试在生产应用程序中做一个小型的 POC。所以我创建了一个新的KMM共享模块并将其添加到Android项目中。对于 Android 部分,它工作正常,但我不知道如何将共享模块包含到 iOS 应用程序中。
根据此链接,文件中应引用iOS项目目录gradle.properties:
xcodeproj=~/iOSProjects/TestKMM
Run Code Online (Sandbox Code Playgroud)
但是当我尝试导入共享模块时,xcode 抱怨没有这样的模块:
所以我认为仅仅引用 中的 iOS 项目gradle.properties是不够的。我一定还缺少其他东西。
另外,我检查了build共享模块的目录,据我所知,没有生成 iOS 工件。(这与存在 a 的实践教程项目不同bin/iosX64/debugFragmework/shared.framework/ ....。)
android ios kotlin-multiplatform kotlin-multiplatform-mobile
我尝试在 Apple App Store 上使用 Kotlin Multiplatform 分发 iOS 应用程序时遇到问题:
\n\n\n\n\n错误 ITMS-90171:“无效的捆绑结构 - 不允许二进制文件 \'Smiledu_app.app/Frameworks/shared.framework/shared\'。您的应用程序可以\xe2\x80\x99t 包含独立的可执行文件或库,除了支持的捆绑包的有效 CFBundleExecutable。有关 iOS 应用程序捆绑包结构的信息,请参阅https://developer.apple.com/go/?id=bundle-struct上的捆绑包编程指南。”
\n
我检查它在“构建阶段”->“复制捆绑资源”中不存在
\n\n这是我的 build.gradle.kts
\nimport org.jetbrains.kotlin.gradle.plugin.mpp.KotlinNativeTarget\n\nplugins {\n kotlin("multiplatform")\n kotlin("native.cocoapods")\n kotlin("plugin.serialization")\n id("com.android.library")\n id("kotlin-android-extensions")\n id("com.squareup.sqldelight")\n}\n\nrepositories {\n gradlePluginPortal()\n google()\n jcenter()\n mavenCentral()\n maven {\n url = uri("https://dl.bintray.com/kotlin/kotlin-eap")\n }\n}\n\ndependencies {\n implementation("androidx.lifecycle:lifecycle-livedata-ktx:2.2.0")\n}\n\nconfigurations {\n create("compileClasspath")\n}\n\nandroid {\n compileSdkVersion(29)\n sourceSets["main"].manifest.srcFile("src/androidMain/AndroidManifest.xml")\n defaultConfig {\n minSdkVersion(24)\n targetSdkVersion(29)\n versionCode = 1\n versionName = "1.0"\n }\n buildTypes {\n getByName("release") {\n isMinifyEnabled = false\n }\n …Run Code Online (Sandbox Code Playgroud) 我目前正在开发一个简单的 KMM 模块,需要它Context才能执行一些操作。我知道通过扩展Application类和进行依赖注入来实现这一点的方法。我现在正在尝试做什么 - 使该模块开箱即用,无需修改manifest或在启动时进行手动注入。我只是想知道这样做是不是一种不好的做法:
@SuppressLint("StaticFieldLeak")
object SomeUtil {
private val context = Activity().applicationContext
}
Run Code Online (Sandbox Code Playgroud)
由于applicationContext返回Context整个应用程序并且我们正在初始化它一次,会出现泄漏吗?还是还有其他几点没做到?
也许还有其他一些可能性可以从模块获取应用程序上下文?我已经看到了一些从线程中检索它的示例,但据我了解,这将被(或已经)弃用。
UPD:这会导致错误。Activity()似乎是null。那么,有什么想法如何在没有 DI 和“MyApplication”的情况下实现这一目标吗?
由于平台限制,我们无法将 Java 源代码与 Kotlin Multiplatform Mobile 一起使用。
但如果 Kotlin 与 Java 100% 兼容,为什么我们不能将 Java 与 Kotlin Multiplatform Mobile 一起使用呢?我的意思是不仅在 Android 或 JVM 部分使用它,而且在共享代码的公共部分使用它。我们可以用 Java 编写 iOS 应用程序:)
java kotlin kotlin-multiplatform kmm kotlin-multiplatform-mobile
我按照此处的指南尝试在新的 KMM 项目中使用不带 CocoaPods 的 iOS 框架:
https://kotlinlang.org/docs/kmm-add-dependency.html#without-cocoapods
我有一个现有的、工作的 .xcframework,我将其添加到 .xcframework 下的项目中shared/src。我添加了一个MyKit.def文件并在同一共享目录中src/nativeInterop/cinterop/更新了该文件:build.gradle.kts
MyKit.def 看起来像
language = Objective-C
modules = MyKit
package = MyKit
Run Code Online (Sandbox Code Playgroud)
构建.gradle.kts
import org.jetbrains.kotlin.gradle.plugin.mpp.KotlinNativeTarget
plugins {
kotlin("multiplatform")
id("com.android.library")
}
kotlin {
android()
val iosTarget: (String, KotlinNativeTarget.() -> Unit) -> KotlinNativeTarget =
if (System.getenv("SDK_NAME")?.startsWith("iphoneos") == true)
::iosArm64
else
::iosX64
iosTarget("ios") {
binaries {
framework {
baseName = "shared"
}
}
}
sourceSets {
val commonMain by getting
val commonTest by getting { …Run Code Online (Sandbox Code Playgroud) android ios kotlin-multiplatform xcframework kotlin-multiplatform-mobile
我正在尝试将一个库部署到 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)
}