通过 SKIE 在 Swift 中使用 Kotlin Flows

问题描述 投票:0回答:1

我正在一个项目中使用 Kotlin Multiplatform,仅共享业务逻辑数据。在我的

shared
库中,我实现了一个用例类,它提供了这样的流程存储库状态

class GetCatImagesForHomeScreenUseCase(private val repository: CatRepository) {

suspend operator fun invoke(limit: Int): Flow<RepositoryResult<List<CatImageDtoItem>>> =
    repository.getCatImages(limit = limit, imageSize = CatImageSize.MEDIUM
)

在我的 swift 类中,我将使用流数据并使用 SKIE 插件将其显示到 UI。所以我已将插件添加到我的

build.gradle.kts
文件中并编写了这样的 swift 代码

import SwiftUI
import shared

struct ContentView: View {
    @ObservedObject private(set) var viewModel: ViewModel
    
    var body: some View {
        CatImagesView(catImagesUrls: viewModel.cats)
            .onAppear { self.viewModel.startObserving() }
    }
}

extension ContentView {
    @MainActor
    class ViewModel: ObservableObject {
        @Published var cats: [CatImageDtoItem] = []
        
        func startObserving() {
            Task {
                let usecase = KotlinDependencies.shared.getCatImagesForHomeScreenUseCase()
                for catItem in usecase.invoke(limit: 50) {
                    self.cats.append(catItem)
                }
            }
        }
    }
}

struct CatImagesView: View {
    let catImagesUrls: [CatImageDtoItem]
    var body: some View {
         ScrollView {
             LazyVGrid(columns: [GridItem(.flexible()), GridItem(.flexible())]) {
                 
             }
         }
    }
}

当我尝试编译代码时,我收到此错误消息:

For-in loop requires 'any Kotlinx_coroutines_coreFlow' to conform to 'Sequence'
在 for 循环中。`

有人可以解释一下我在这里缺少什么吗?我很想使用这个 SKIE 插件,但我不喜欢为每个流程编写一些样板包装器。

swift kotlin sequence kotlin-multiplatform skie
1个回答
0
投票

你找到解决办法了吗?

这是 SKIE 中的已知问题,应该在未来的版本中修复。

https://skie.touchlab.co/features/flows#unsupported-automatic-conversions

还有一个线程,其中 SKIE 的创建者之一回答了这个问题。

© www.soinside.com 2019 - 2024. All rights reserved.