KMM 如何快速使用 kotlin 泛型?

问题描述

抱歉我的英语不好:(

我想用 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 (将#修改为@)