callbackFlow
Callback
을 Flow
로 변경하는 Flow
Builder
이다.
Flow
와 Listener
내부의 스코프가 다르기 때문에 Listener
내부에서 emit()
을 사용하여 데이터를 보낼 수 없는데, callbackFlow
를 사용하면 Listener
내부의 값을 Flow
로 보낼 수 있다.
fun EditText.textChanges(): Flow<CharSequence?> =
callbackFlow {
val listener = object: TextWatcher {
override fun afterTextChanged(s: Editable?) = Unit
override fun beforeTextChanged(s: CharSequence?, start: Int, count: Int, after: Int) = Unit
override fun onTextChanged(s: CharSequence?, start: Int, before: Int, count: Int) { trySend(s) }
}
addTextChangedListener(listener)
awaitClose { removeTextChangedListener(listener) }
}.onStart { emit(text) }