我想从的数据库中检索单个对象,所以我在Dao中有这个方法
// in Dao
@Query("SELECT * FROM table_foo ORDER BY RANDOM()")
fun getSingleFoo(): Flow<FooEntity>
然后,该对象将映射到其他模型中,比方说PlainFoo。
// in Repository
fun getRandomFoo(): Flow<PlainFoo> = dao.getSingleFoo()
.map(FooEntity::asExternalModel)
但是在这个应用程序的
函数collectAsState()适用于StateFlow属性,以便在Composable中观察它。
可组合需要StateFlow,因为StateFlow保证初始值。Flow并没有提供这样的保证。
现在,如果我有一个StateFlow属性,但是我想在收集Composable中的Flow之前应用一个操作符(比如map),那么该怎么做呢?
这里有一个例子:
假设存储库公开了一个StateFlow<MyClass>
val myClassStateFlow: StateFlow<MyClass>
data class MyClass(val a: String)
..。视
当将Livedata作为对Room中表的select*查询的返回类型时,我观察到,如果我更新/插入/删除该表中的一个条目,就会得到触发器。然而,当我尝试使用Kotlin流时,我只得到两个触发器。
第一个触发器提供一个空值,因为stateflow的初始值是null。第二个触发器是Room表中的条目列表。
如果在DB上执行insert/delete操作,则会收到来自StateFlow的触发器。但是,如果我更新一个条目,Stateflow不会触发。
N.B:更新操作在DB上正确工作。我使用DB检查器.进行了检查
数据类& DAO
@Entity
data class CartItem (
我有一个用例,在这个用例中,我需要连接和断开作为服务的类。只有当服务连接时,才能对服务执行操作。当服务通过回调连接或断开连接时,会通知客户端:
class Service {
constructor(callback: ConnectionCallback) { ... }
fun connect() {
// Call callback.onConnected() some time after this method returns.
}
fun disconnect() {
// Call callback.onCon
我有这样的密码:
private val appViewModel: AppViewModel by activityViewModels()
private lateinit var user: User
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
// This sets the variable user to the value collected from a StateFlow from ap
我对kotlin流很陌生。我跟随在Android中设置UI层。
这是我的UI stateFlow
private val _teamsUiState = MutableStateFlow(TeamsUiState())
val teamsUiState: StateFlow<TeamsUiState> = _teamsUiState.asStateFlow()
这是我的TeamsUiState数据类:
data class TeamsUiState(
val teamItems: ArrayList<Team> = ArrayList(),
val er
我正在使用RecyclerView,并使用Retrofit从服务器获取数据。我使用Kotlin和MVVM设计模式。我用过LiveData,它运行得很好。但是当我们导航到另一个片段并再次回到同一个片段时,Stateflow会引发问题。它只会再次获取相同的数据。下面是ViewModel和观察者的代码:
//视图模型
private val _allTimeSheetsResponse =
MutableStateFlow<ResponsesResult<AllTimeSheetsResponse>>(ResponsesResult.Empty)
va
在使用StateFlow与Jetpack一起使用时,我遇到了一个奇怪的问题,在这个问题上,我没有在StateFlow中接收更新的值。这就是我如何按照示例中的建议尝试观察Stateflow的代码。
@Composable
fun List(homeViewModel: HomeViewModel) {
val appState by homeViewModel.stateFlow.collectAsState()
if (appState.isLoading) {
CircularProgressIndicator()
}
MaterialTheme {
LazyColumn
我在StateFlow类中没有几个ViewModel字段。它是添加/编辑表单屏幕,其中每个StateFlow都是屏幕上每个可编辑字段的验证属性。
我想为整个表单的验证状态编写一些带有FormValidation属性的类StateFlow。此字段的值基于所有字段的验证状态值,当所有字段都有效时发出true,在任何字段无效时发出false。
就像这样:
class FormValidation(initValue: Boolean, vararg fieldIsValid: StateFlow<Boolean>) {
private val _isValid = Mu
我的存储库层有一个MutableStateFlow,在我的ViewModel中收集它。我在一些用户设备上得到了这个NPE
Fatal Exception: java.lang.NullPointerException
at a.b.c.ui.viewmodel.HomeViewModel$collectFlowState$$inlined$collect$1.emit(HomeViewModel.java:189)
at a.b.c.ui.viewmodel.HomeViewModel$collectFlowState$$inlined$collect$1$1.in
假设我有一个不断更新的流,如下所示:
locationFlow = StateFlow<Location?>(null)
我有一个用例,在某个特定事件发生后,我希望从流中收集X值并继续,如下所示。我知道collect是一个终端操作员,所以我不认为下面的逻辑是可行的,但是在这种情况下我怎么能做到这一点呢?我想收集X项,保存它们,然后将它们发送到另一个函数进行处理/处理。
fun onEventOccurred() {
launch {
val locations = mutableListOf<Location?>()
loc
因此,我使用RecylerView更新StateFlow<List>,如下所示:
我的数据类:
data class Student(val name: String, var isSelected: Boolean)
我的ViewModel逻辑:
fun updateStudentsOnSelectionChanged(targetStudent: Student) {
val targetIndex = _students.value.indexOf(targetStudent)
val isSelected = !targetStudent.isSelecte
Kotlin 1.4.21
我有一个非常简单的ViewModel,它使用coroutine和stateFlow。但是,单元测试将失败,因为stateFlow似乎没有得到更新。
我认为这是因为测试将在stateFlow更新之前完成。
expected not to be empty
这是我的ViewModel正在测试中
class TrendingSearchViewModel @Inject constructor(
private val loadTrendingSearchUseCase: LoadTrendingSearchUseCase,
private val cor
我有一个StateFlow,我的List可从它收集任何更改为State。
private val _people = MutableStateFlow(personDataList())
val people = _people.asStateFlow()
在我的viewModel中,我在_people上执行修改,并验证people作为read-only StateFlow也在更新。我还必须将原始的_people复制为普通的kotlin map,以便用于某些验证用例。
val copyAsMap : StateFlow<MutableMap<Int, Person>>
在我的ViewModel中,我发出API请求,并使用StateFlow和SharedFlow与片段进行通信。在发出API请求时,我可以轻松地更新状态流的值,并成功地将其收集到片段中。
但是在提出请求之前,我使用SharedFlow发出一些布尔值,而在片段中收集的是而不是。谁能帮我一下为什么会发生这种事?
class MainViewModel: ViewModel() {
private val _stateFlow = MutableStateFlow(emptyList<Model>())
val stateFlow = _stateFlow.asStateFlow()