如何在 iOS 中使用我的 kotlin 存储库中的 Flow?

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

在我的 KMM 应用程序中,我有使用此方法的 kotlin 共享代码:

fun getUserProfile(): Flow<UserInfo?> =
        firestore.collection("UserInfo").document(auth.currentUser!!.uid).snapshots
            .mapLatest { user ->
                user.data<UserInfo>()
            }
            .catch { ex ->
                println("Something wrong")
            }

我在android中调用方法的方式:

视图模型:

val userInfo = repo.getUserProfile().catch { println("no User found") }

用户界面:

usersViewModel.userInfo.collectAsState(null).apply { }

我想要我的 iOS SwiftUI 类似的东西,我想要一个简单的调用:

func getUserInfo(){
 }
kotlin swiftui android-livedata kotlin-multiplatform kotlin-stateflow
1个回答
0
投票

直接手动消耗Flow并不是很好。有两个主要的库选项。我们出版了 SKIE,我会推荐它。具体来说,对于您想做的事情,请看一下:https://skie.touchlab.co/features/flows-in-swiftui

科特林

class SharedViewModel {
    
    val counter = flow<Int> {
        var counter = 0
        while (true) {
            emit(counter++)
            delay(1.seconds)
        }
    }

    val toggle = MutableStateFlow<Boolean>(false)
}

斯威夫特

struct ExampleView: View {
    let viewModel = SharedViewModel()

    var body: some View {
        // Observing multiple flows with attached initial values, only requiring a single view closure for content.
        Observing(viewModel.counter.withInitialValue(0), viewModel.toggle) { counter, toggle in
            Text("Counter: \(counter), Toggle: \(toggle)")
        }
    }
}

另一个选项是 https://github.com/rickclephas/KMP-NativeCoroutines

SKIE 实际上增强了 Kotlin 编译器的输出,生成 Swift 并编译到框架中。 KMPNC更多的是一个标准库,但是需要更直接的生命周期管理等

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