问题描述
抱歉我的英语不好:(
我想用 KMM 创建应用程序,并最大化共享代码。只有我想写两次的是 UI 和导航。所以我在共享代码中创建了 ViewModel。
open class ViewModel<T>(initialState: T) where T : ViewState {
private val _state = MutableStateFlow(initialState)
val currentState: T
get() = stateFlow.value
val stateFlow: StateFlow<T> = _state
fun updateState(
context: CoroutineContext = EmptyCoroutineContext,mapping: (currentState: T) -> T
) { GlobalScope.launch(context) { _state.emit(mapping(_state.value)) } }
}
ViewState 所在的位置
interface ViewState
用于在密封类中实现,描述当前视图状态。当它更改 UI 时,接收更改和更新。状态看起来像(我发现的第一个免费公共 API 返回随机狗图像):
sealed class DogImageViewState : ViewState {
object Loading : DogImageViewState()
data class Content(val image: String) : DogImageViewState()
}
好的
所以我创建了具体的 ViewModel 来在 iOS 和 android 之间共享逻辑
class DogImageViewModel(initialState: DogImageViewState) : ViewModel<DogImageViewState>(initialState) {
private val interactor : GetDogImageUrlInteractor by dogDi.instance()
init {
getImage()
}
fun reload() {
updateState { DogImageViewState.Loading }
getImage()
}
private fun getImage() {
GlobalScope.launch(ioDispatcher) {
val image = interactor.getImageUrl()
updateState { (it as? Content)?.copy(image = image) ?: Content(image = image) }
}
}
}
简单,初始? Viewmodel 用 Loading 初始化,并立即开始图像加载。图像加载后进入新状态。刷新动作完全一样
Android 中的用法很简单,jetpack compose 可以 collectAsState
StateFlow 没什么可做的,只需要用 state 来描述一个 ui
问题出在 iOS
我们必须“桥接”iOS 的可观察模型。 iOS 有 ObservableObject
机制,我对其进行了扩展
class ObservableViewModel<T : ViewState>: ObservableObject {
@Published var state : T
init(viewModel: ViewModel<T>) {
self.state = viewModel.currentState
viewModel.onChange { newState in
self.state = newState as! T
}
}
}
看起来不错。 ViewState 的通用类...现在我可以将它与 SwiftUI 一起使用!哦不...
当我尝试在代码中使用 ObservableViewModel
时,我收到一个错误
@StateObject var vm = ObservableViewModel<DogImageViewState>(viewModel: DogImageViewModel(initialState: DogImageViewState.Loading()))
类型“DogImageViewState”不符合协议“ViewState”
但是完全符合!!!
当我跳转到定义 DogImageViewState
时,我看到下一个
__attribute__((swift_name("DogImageViewState")))
@interface DogDogImageViewState : DogBase <DogSharedViewState>
@end;
看起来一点都不符合。什么是Base<ViewState>
(DogBase 因为Dog 功能构建在单独的框架dog
中,DogSharedViewState 因为在shared
中声明了ViewState)?为什么不只是 ViewState
?
如何解释 swift 那个 DogSharedViewState 和完全一样?
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)