下面的代码是使用 ktor 和 kmm 上传文件......
val client = HttpClient(Apache) {}
val file = File("path/to/some.file")
val chatId = "123"
client.submitFormWithBinaryData(
url = "https://api.telegram.org/bot<token>/sendDocument?chat_id=$chatId",
formData = formData {
append("document", file.readBytes(), Headers.build {
append(HttpHeaders.ContentDisposition, "filename=${file.name}")
})
}
)
Run Code Online (Sandbox Code Playgroud) 如何使用 kotlinx.datetime KMM 库获取本周的日期?
例如。我想获取本周日期的列表,例如:
(“星期一,07”,“星期二,08”,“星期三,09”,...)
这是使用Calendar 的类似实现:
fun getDaysOfWeek(): Array<String?> {
val dateFormat = SimpleDateFormat("EEEEE\ndd", Locale.getDefault())
val calendar = Calendar.getInstance()
calendar.firstDayOfWeek = Calendar.MONDAY
calendar.set(Calendar.DAY_OF_WEEK, Calendar.MONDAY)
val days = arrayOfNulls<String>(7)
for (i in 0..6) {
days[i] = dateFormat.format(calendar.time)
calendar.add(Calendar.DAY_OF_MONTH, 1)
}
return days
}
Run Code Online (Sandbox Code Playgroud) android kotlin kotlin-multiplatform kotlin-multiplatform-mobile kotlinx-datetime
我使用 Android Studio 和 Kotlin Multiplatform Mobile 插件创建了一个 KMM 项目,它提供对 Android 和 iOS 的支持。
但是,我还希望能够使用相同的代码库和 UI 进行部署以创建桌面应用程序。那可能吗?如果是的话,怎么办?
我有一个带有 MutableStateFlow 的 KmmShared 单例类,它可以在 Android 上正常工作。我需要知道访问此 Singleton 类及其 MutableStateFlow 变量的最佳方法,并在 SwiftUI 应用程序中进行更新。
class MySingeltonClass {
private val _selectedType: MutableStateFlow<MyEnum> = MutableStateFlow(getUserPrefsType())
var selectedType = _selectedType.asStateFlow()
private fun getUserPrefsType() : MyEnum {
// Get Enum from DB
}
fun setType(scheme: MyEnum) {
// Set Enum in DB
_selectedType.value = scheme
}
companion object {
private lateinit var instance: MySingeltonClass
fun getInstance(): MySingeltonClass {
if (!this::instance.isInitialized) {
instance = MySingeltonClass()
}
return instance
}
}
}
enum class MyEnum {
TYPEA, …Run Code Online (Sandbox Code Playgroud) 我正在尝试构建从 JetBrains 的存储库compose-multiplatform-ios-android-template克隆的项目。该代码在 Android 上运行良好,但在 iOS 上抛出错误。我也尝试过更新cocoapods。尽管如此,这还是会产生错误。现在,当我尝试在Android Studio上构建项目时,我的 logcat 上出现以下错误
java.lang.IllegalStateException: e: Could not find "../shared/build/kotlinTransformedMetadataLibraries/commonMain/org.jetbrains.kotlinx-atomicfu-0.17.3-nativeInterop-8G5yng.klib" in [/Users/rasel/Library/Application Support/kotlin/daemon]
at org.jetbrains.kotlin.library.SingleFileResolveKt$resolveSingleFileKlib$1.fatal(SingleFileResolve.kt:21)
at org.jetbrains.kotlin.library.KotlinLibrarySearchPathResolver.resolve(SearchPathResolver.kt:171)
at org.jetbrains.kotlin.library.KotlinLibrarySearchPathResolver.resolve(SearchPathResolver.kt:176)
at org.jetbrains.kotlin.library.CompilerSingleFileKlibResolveStrategy.resolve(SearchPathResolver.kt:298)
at org.jetbrains.kotlin.library.SingleFileResolveKt.resolveSingleFileKlib(SingleFileResolve.kt:24)
at org.jetbrains.kotlin.library.SingleFileResolveKt.resolveSingleFileKlib$default(SingleFileResolve.kt:15)
at org.jetbrains.kotlin.cli.metadata.KlibMetadataDependencyContainer.<init>(K2MetadataKlibSerializer.kt:117)
at org.jetbrains.kotlin.cli.metadata.K2MetadataKlibSerializer$serialize$analyzer$1.invoke(K2MetadataKlibSerializer.kt:49)
at org.jetbrains.kotlin.cli.metadata.K2MetadataKlibSerializer$serialize$analyzer$1.invoke(K2MetadataKlibSerializer.kt:43)
at org.jetbrains.kotlin.cli.metadata.CommonAnalysisKt.runCommonAnalysisForSerialization(CommonAnalysis.kt:42)
at org.jetbrains.kotlin.cli.metadata.K2MetadataKlibSerializer.serialize(K2MetadataKlibSerializer.kt:48)
at org.jetbrains.kotlin.cli.metadata.K2MetadataCompiler.doExecute(K2MetadataCompiler.kt:122)
at org.jetbrains.kotlin.cli.metadata.K2MetadataCompiler.doExecute(K2MetadataCompiler.kt:40)
at org.jetbrains.kotlin.cli.common.CLICompiler.execImpl(CLICompiler.kt:100)
at org.jetbrains.kotlin.cli.common.CLICompiler.execImpl(CLICompiler.kt:46)
at org.jetbrains.kotlin.cli.common.CLITool.exec(CLITool.kt:101)
at org.jetbrains.kotlin.daemon.CompileServiceImpl.compile(CompileServiceImpl.kt:1486)
at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
at java.base/java.lang.reflect.Method.invoke(Unknown Source)
at java.rmi/sun.rmi.server.UnicastServerRef.dispatch(Unknown Source)
at java.rmi/sun.rmi.transport.Transport$1.run(Unknown Source)
at java.rmi/sun.rmi.transport.Transport$1.run(Unknown Source)
at java.base/java.security.AccessController.doPrivileged(Unknown …Run Code Online (Sandbox Code Playgroud) 我想知道是否可以使用kotlin-multiplatform插件访问androidMain sourceSets中的Android上下文应用程序。
这是build.gradle文件
apply plugin: 'kotlin-multiplatform'
kotlin {
targets {
final def iOSTarget = System.getenv('SDK_NAME')?.startsWith("iphoneos") \
? presets.iosArm64 : presets.iosX64
fromPreset(iOSTarget, 'iOS') {
compilations.main.outputKinds('FRAMEWORK')
}
fromPreset(presets.jvm, 'android')
}
sourceSets {
commonMain {
kotlin.srcDir('src')
dependencies {
implementation "org.jetbrains.kotlin:kotlin-stdlib-common:$kotlin_version"
// coroutine
implementation "org.jetbrains.kotlinx:kotlinx-coroutines-core-common:1.1.0"
}
}
androidMain {
dependencies {
implementation "org.jetbrains.kotlin:kotlin-stdlib:$kotlin_version"
// Timber
implementation "com.jakewharton.timber:timber:$timber_version"
// coroutine
implementation "org.jetbrains.kotlinx:kotlinx-coroutines-android:1.1.0"
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
我尝试将'com.android.application'插件添加到androidMain源中,但是同步失败。
提前致谢
我们正在使用 kotlin multiplatform 进行公司的下一个项目。一切正常,直到我尝试为 android 创建一个发布版本以进行 beta 测试。我在发布版本中遇到此错误,而在调试中一切正常。
[NetworkManager] unknown exception: l.a.w: Can't locate argument-less serializer for class a. For generic classes, such as lists, please provide serializer explicitly.
Run Code Online (Sandbox Code Playgroud)
这是项目级 build.gradle
buildscript {
ext.kotlin_version = '1.3.70'
ext.versions = [
"ktor" : "1.3.2",
"serialization" : "0.20.0",
"coroutines" : "1.3.6",
]
repositories {
maven { url 'https://maven.google.com' }
maven { url 'https://dl.google.com/dl/android/maven2' }
maven { url "https://s3-eu-west-1.amazonaws.com/elasticode-sdk/Android/maven/" }
google()
jcenter()
}
dependencies {
classpath 'com.android.tools.build:gradle:3.6.3'
classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
classpath "org.jetbrains.kotlin:kotlin-serialization:$kotlin_version"
classpath 'com.google.firebase:firebase-crashlytics-gradle:2.2.0'
classpath …Run Code Online (Sandbox Code Playgroud) android kotlin kotlin-multiplatform kotlinx.serialization kotlinx
我简化了错误,我只有这个类:
class TestClass{
private var string = "Hello"
fun testError() {
string= "It Works"
GlobalScope.launch(Dispatchers.Default) {
string = "Doesn't work"
}
}
}
Run Code Online (Sandbox Code Playgroud)
如果我在主线程(在 IOS 上)上启动 TestClass().testError(),它会抛出一个 InvalidMutabilityException(在 line --> string = "Doesn't work")。所以我认为在创建变量的线程之外的线程上更改变量可能不是一个好主意。所以我改成这样:
class TestClass{
private var string = "Hello"
fun testError() {
string= "It Works"
GlobalScope.launch(Dispatchers.Default) {
withContext(Dispatchers.Main) { string = "Doesn't work" }
}
}
}
Run Code Online (Sandbox Code Playgroud)
但它仍然抛出一个错误:
kotlin.native.concurrent.InvalidMutabilityException:冻结 com.example.project.TestClass@fe10a8 的突变尝试
顺便一提。上面的两个代码都适用于 Android 端
在 http 请求中将数据类序列化为 json 时,我遇到了一个奇怪的问题。
工作代码:
@Serializable
data class ComanyCustomerLoginData(
val email: String,
val credential: String,
val companyUUID: String,
)
val customerLoginData = ComanyCustomerLoginData("trwla@gmail.com", "1234", "d80f0b72-a062-11eb-bcbc-0242ac130002")
val response = client.post<HttpResponse>(URL) {
contentType(ContentType.Application.Json)
body = customerLoginData
}
Run Code Online (Sandbox Code Playgroud)
非工作代码
@Serializable
data class ComanyCustomerLoginData(
val email: String,
val credential: String,
val companyUUID: String = "d80f0b72-a062-11eb-bcbc-0242ac130002",
)
val customerLoginData = ComanyCustomerLoginData("trwla@gmail.com", "1234")
val response = client.post<HttpResponse>(URL) {
contentType(ContentType.Application.Json)
body = customerLoginData
}
Run Code Online (Sandbox Code Playgroud)
在非工作代码中,在数据类构造函数中有一个默认参数,但是当它被序列化时,我在该 json 中看不到 companyUUID,但工作代码创建了一个名为 companyUUID 的键。
你能指出是什么问题吗?
我已经在线阅读了多个内容,但仍然无法理解 Kotlin 多平台移动版与 Kotlin Native 之间有明显区别吗?