Kotlin多平台流量块转换为iOS的自定义包装器流量使用

发布于 2025-02-10 23:56:35 字数 2117 浏览 2 评论 0原文

我有一个Kotlin多平台项目,该项目包含Apollo GraphQl API

在此项目中,我有BaseerePository类,在此类中,有一种执行查询或突变的方法

suspend fun <D : Query.Data> executeQuery(query: Query<D>): ApolloResponse<D> {
        val response = getApolloClient().query(query).execute()

        checkOperation(response)

        return response
    }

    suspend fun <D : Mutation.Data> executeMutation(mutation: Mutation<D>): ApolloResponse<D> {
        val response = getApolloClient().mutation(mutation).execute()

        checkOperation(response)

        return response
    }

例如,我想使用此方法在这样的存储库中,

class HelpRepository : BaseRepository() {

    fun test(request: AddFeedBackRequest) = flow {

        val feedBackType = if (request.type == AddFeedBackType.Bug) {
            FeedbackType.BUG
        } else {
            FeedbackType.FEEDBACK
        }

        val input = AddFeedbackInput(request.note, Optional.presentIfNotNull(feedBackType))

        emit(true)

        val mutation = AddFeedbackMutation(input)

        val response = executeMutation(mutation)

        emit(false)

    }
}

当我添加流程范围时,我不必将此方法转换为悬挂函数,

我不想因为iOS应用而不想使用悬挂函数。当我使用悬挂函数时,Xcode中的“ Kotlinx_coroutines_coreflowcollector”转换为“ kotlinx_coroutines_coreflowcollector”,

因此我在使用单个变量的包装器时找到了像This this this warper的包装器函数

fun <T> Flow<T>.asCommonFlow(): CommonFlow<T> = CommonFlow(this)
class CommonFlow<T>(private val origin: Flow<T>) : Flow<T> by origin {
    fun listen(block: (T) -> Unit): Closeable {
        val job = Job()

        onEach {
            block(it)
        }.launchIn(CoroutineScope(Dispatchers.Main + job))

        return object : Closeable {
            override fun close() {
                job.cancel()
            }
        }
    }
}

工作。。

,它在Xcode中完全可以 t找到一种适当的方法来执行此操作

我需要一个像

= commonFlow {
}

instead of this

= flow {
}

这样的包装器,以将此方法用作通用流包装器

您能帮我吗?

I have a kotlin multi platform project which contains apollo graphql api

in this project i have BaseRepository Class and in this class there is a method to execute query or mutations

suspend fun <D : Query.Data> executeQuery(query: Query<D>): ApolloResponse<D> {
        val response = getApolloClient().query(query).execute()

        checkOperation(response)

        return response
    }

    suspend fun <D : Mutation.Data> executeMutation(mutation: Mutation<D>): ApolloResponse<D> {
        val response = getApolloClient().mutation(mutation).execute()

        checkOperation(response)

        return response
    }

For example i want to use this method in Some repository like this

class HelpRepository : BaseRepository() {

    fun test(request: AddFeedBackRequest) = flow {

        val feedBackType = if (request.type == AddFeedBackType.Bug) {
            FeedbackType.BUG
        } else {
            FeedbackType.FEEDBACK
        }

        val input = AddFeedbackInput(request.note, Optional.presentIfNotNull(feedBackType))

        emit(true)

        val mutation = AddFeedbackMutation(input)

        val response = executeMutation(mutation)

        emit(false)

    }
}

when i add the flow scope i shouldn't be had to convert this method to a suspend function

i dont want to use suspend function because of ios application. When i use suspend function its convert "Kotlinx_coroutines_coreFlowCollector" in xcode

so i found a wrapper function like this

fun <T> Flow<T>.asCommonFlow(): CommonFlow<T> = CommonFlow(this)
class CommonFlow<T>(private val origin: Flow<T>) : Flow<T> by origin {
    fun listen(block: (T) -> Unit): Closeable {
        val job = Job()

        onEach {
            block(it)
        }.launchIn(CoroutineScope(Dispatchers.Main + job))

        return object : Closeable {
            override fun close() {
                job.cancel()
            }
        }
    }
}

when i use this wrapper with single variable it works exactly what i want in xcode.

but in functions i couldn't find a proper way to do this

i need a wrapper like

= commonFlow {
}

instead of this

= flow {
}

to use this method as a commonFlow wrapper

Can you help me ?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

聽兲甴掵 2025-02-17 23:56:36

我们在一个项目中有几乎相同的事情。我们具有将常规流量转换为“常见”流的扩展函数,因此可以在Android和iOS中使用。

您可以像往常一样创建流,并在最后包装。

fun <T> Flow<T>.wrap(): CommonFlow<T> = CommonFlow(this)

class HelpRepository : BaseRepository() {

fun test(request: AddFeedBackRequest) = flow {

    val feedBackType = if (request.type == AddFeedBackType.Bug) {
        FeedbackType.BUG
    } else {
        FeedbackType.FEEDBACK
    }

    val input = AddFeedbackInput(request.note, Optional.presentIfNotNull(feedBackType))

    emit(true)

    val mutation = AddFeedbackMutation(input)

    val response = executeMutation(mutation)

    emit(false)

}
}.wrap()

We have pretty much the same thing in one of our projects. We have a extension function that converts the regular flow to a "common" flow so it can be used in both Android and iOS.

You can created flow like always, and wrap it at the end.

fun <T> Flow<T>.wrap(): CommonFlow<T> = CommonFlow(this)

class HelpRepository : BaseRepository() {

fun test(request: AddFeedBackRequest) = flow {

    val feedBackType = if (request.type == AddFeedBackType.Bug) {
        FeedbackType.BUG
    } else {
        FeedbackType.FEEDBACK
    }

    val input = AddFeedbackInput(request.note, Optional.presentIfNotNull(feedBackType))

    emit(true)

    val mutation = AddFeedbackMutation(input)

    val response = executeMutation(mutation)

    emit(false)

}
}.wrap()
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文