我正在将我的Android项目迁移到Jetpack Compose。为此,我从Compose的一个单独的单例类中发出StateFlow
事件,并在ViewModel中发出collect
事件。但是,在发出一个事件后,不会从ViewModel中的流收集任何其他事件:
1.从我的单例类中发出:
/**
* Class that emits bottom sheet events (expanded, collapsed, etc.).
*/
@Singleton
class BottomSheetEventProducer {
private val _eventsFlow = MutableStateFlow<SheetEvent>(SheetEvent.Collapsed)
val eventsFlow: Flow<SheetEvent> = _eventsFlow
fun produceEvent(event: String) {
var sheetEvent: SheetEvent = SheetEvent.Collapsed
if (event.contains(SheetEvent.Collapsed.Const().value)) {
sheetEvent = SheetEvent.Collapsed
} else if (event.contains(SheetEvent.Expanded.Const().value)) {
sheetEvent = SheetEvent.Expanded
}
Log.i("BottomSheetEventsSingleton", "produceEvent: $sheetEvent")
_eventsFlow.value = sheetEvent
}
}
1.在视图模型中收集:
@HiltViewModel
class FarmViewModel @Inject constructor(
private val bottomSheetEvents: BottomSheetEvents
) : ViewModel() {
init {
viewModelScope.launch {
bottomSheetEvents.eventsFlow
.collect { event ->
Log.i("FarmViewModel", "flow event: $event)")
}
}
}
collect
中的Log.i只显示初始值,之后什么也不显示。
1条答案
按热度按时间rur96b6h1#
您似乎希望使用函数创建一个事件,然后在视图模型中查看生成的事件。但是,不清楚这些事件应在何时生成。下面是一个与您的示例类似的示例:
在本例中,创建了一个数据源作为事件类的等价物,它使用共享流每三秒钟生成一个随机字符串。
然后,您可以在视图模型中收集生成的字符串,如下所示: