在我的 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(){
}
直接手动消耗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更多的是一个标准库,但是需要更直接的生命周期管理等