代码之家  ›  专栏  ›  技术社区  ›  Mister Smith

Kotlin:如何创建一个无流量

  •  0
  • Mister Smith  · 技术社区  · 4 年前

    我正在使用 Flow 只是为了从ViewModel与活动进行通信,但我实际上不需要向活动传递任何参数。我只需要活动来对呼叫做出反应。

    现在我有一个可为null类型的流:

    val myFlow: Flow<Nothing?> = someChannel.receiveAsFlow()

    我需要发出一个null,因为 Nothing 无法实例化:

    someChannel.send(null)

    我想做的事情:

    val myFlow: Flow<Nothing>

    然后:

    someChannel.send()

    但这当然不能编译。

    有更好的方法吗?

    1 回复  |  直到 4 年前
        1
  •  4
  •   Sergio    4 年前

    如在另一个回答中所提到的, Nothing 有不同的目的。您也可以考虑使用 Unit 为此:

    val myFlow: Flow<Unit> = someChannel.receiveAsFlow()
    someChannel.send(Unit)
    

    如果您在代码中有几个位置可以调用 someChannel.send(Unit) 可以在上创建扩展函数 SendChannel 并将其称为 someChannel.send(单位) :

    suspend fun SendChannel<Unit>.send() = send(Unit)
    

    然后打电话:

    someChannel.send()
    
        2
  •  2
  •   sergpetrov    4 年前

    Nothing 用于不同的目的。 从科特林 docs :

    没有什么是没有实例的。您可以使用Nothing来表示“一个永远不存在的值”:例如,如果函数的返回类型为Nothing,则意味着它永远不会返回(总是抛出异常)。

    但你试图发出 null 值(不是 没有什么 ). 所以,看起来你正在寻找一个你真的不需要的变通方法。

    例如,您可以创建 EmptyState 键入并使用它

    val myFlow: Flow<EmptyState>