我有一个带有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, TYPEB, TYPEC;
}
如果我可以有一个MySingeltonWrapperClass
与一个@Published var selectedType
或一个@ObservedObject private var selectedType
是我试图在Swift中实现的东西。
1条答案
按热度按时间qvk1mo1f1#
这是个很棘手的主题。SwiftUI应用程序中
Flow
/StateFlow
的主要问题在于KotlinSwift互操作性<->。因为它有几个限制:CoroutineScope
中启动流,以便能够取消作业好文章更好理解:one,two
有几种可用的解决方法:
1.将
Flow
封装到Kotlinclass
中。你可以在official KMM sample repo中找到这种技术的很好的例子。首先,author introduces new class
CFlow
:然后在SwiftUI中使用它:
2.使用特殊库,如KMP-NativeCoroutines。
当你设置这个库时,你可以为你的Kotlin
Flow
/StateFlow
创建SwiftAnyPublisher
:3.不要使用
Flow
/StateFlow
。你可以用简单的替代品。看看Decompose project,它是Value
class。你仍然可以很容易地在你的Compose应用程序中使用它来获得
State
,sample from Decompose:在SwiftUI中,你可以使用
ObservableValue
helper from Decompose: