我正在尝试使用Paging 3库来获取Flow<PagingData<Scan>>,Room然后检查是否在 recyclerview 中选择了项目,因此我将此类映射到另一个名为 的类ScanMapper。为了实现此映射,每当用户将某个项目标记为选定时,我都会Map在MutableStateFlow<Map<Int, State>>. 这里Map查找 anIndex(Int)得到State,State只是一个enum代表 State 的类UNINITIALISED,USELECTED并且SELECTED。
我将 Map 的值设置为 a StateFlow<Map<Int,State>>。问题是,我试图将Flow<PagingData<Scan>>与 结合起来,StateFlow<Map<Int,State>>以便将 也State作为参数传递给ScanMapper类,因为它State是从 中获取的StateFlow<Map<Int,State>>,而不是原始Scan类的一部分。但是,尽管当我使用该功能将项目标记为在项目单击上选择时,PagingDataAdapter似乎总是会出现这种情况。State UNINITIALISEDmarkSelected(scanId: Int)
请告诉我我在这里缺少什么。
更新
我能够通过使用并使用回收器适配器Flow<List<Scan>>删除库的使用来实现我想要的功能。虽然这不是实际的解决方案,因为它消除了库,但以下更改允许我执行项目选择:Paging 3DiffUtilspagination using paging 3
更新了刀 …
我们知道StateFlow和SharedFlow很热门。
\n\n\nStateFlow 是一个热流\xe2\x80\x94,只要该流被收集\n或者垃圾收集根中存在对其的任何其他引用,它就会保留在内存中。
\n
\n\nSharedFlow 是一个热流,它向所有从其收集的使用者发送值。\n
\n
水流本身是冷的。
\n\n\n流是类似于序列的冷流......
\n
我有一个问题无法找到直接答案。LiveData 是热的还是冷的?
\nandroid android-livedata kotlin-flow kotlin-stateflow kotlin-sharedflow
我尝试在一个协程中初始化三个收集,但仅第一个起作用。仅当我设置在不同的协程中收集其工作时。为什么?
lifecycleScope.launch {
launch {
homeViewModel.dateStateFlow().collect { date ->
date?.let { calendar.text = date.toStringForView() }
}
}
launch {
homeViewModel.toStateFlow().collect { to ->
to?.let { cityTo.text = to.name }
}
}
launch {
homeViewModel.fromStateFlow().collect { from ->
from?.let { cityFrom.text = from.name }
}
}
}
Run Code Online (Sandbox Code Playgroud) 我有一个StateFlow包含简单的字符串列表。我希望能够过滤该字符串列表。每当过滤器更新时,我想向 StateFlow 推送新的更新。
class ResultsViewModel(
private val api: API
) : ViewModel() {
var filter: String = ""
val results: StateFlow<List<String>> = api.resultFlow()
.stateIn(viewModelScope, SharingStarted.Eagerly, emptyList())
}
Run Code Online (Sandbox Code Playgroud)
map将 a 粘贴到 上很容易api.resultFlow():
val results: StateFlow<List<String>> = api.resultFlow()
.map { result ->
val filtered = mutableListOf<String>()
for (r in result) {
if (r.contains(filter)) {
filtered.add(r)
}
}
filtered
}
.stateIn(viewModelScope, SharingStarted.Eagerly, emptyList())
Run Code Online (Sandbox Code Playgroud)
但是,如何让流程在filter发生变化时真正发出更新呢?目前,这仅适用于filter设置的初始值。
我正在尝试弄清楚流/状态流和数据绑定。
\n在我的项目中,我有 Room 中的“打印机”列表,以及 SharedPreferences 中的“默认打印机”的 ID。
\n\n我是否使用了良好的流程并做得很好,还是出了什么问题?
\n房间给我一个Flow<List<Printer>>。借助我的适配器,我将其显示在回收器视图中viewModel.allPrinters.collect。
但是,当我想从房间绑定资源时,绑定“需要”LiveData 或 StateFlow,这是我的困难,因为 stateIn 需要协程。
\n我怎样才能从我的默认打印机Flow<List<Printer>>(通过他的属性“id”在列表中找到它)并确保列表/项目是否更新,我的参考也将获得更新?\n如果我更改打印机的名称defaultPrinter并将其更新到 room(感谢我的存储库/room DAO),我希望在我的对象defaultPrinter和列表中更改名称。
您还可以确认我的变量类型defaultPrinter应该是StateFlow<Printer?>
注意:当我更新项目时,printerRoomDAO.update(item:Printer)我必须传递数据对象的副本Printer(新引用),否则我的 UI 将不会更新。
isPrinterListEmpty这是我的 ViewModel 中的示例
val hasNoPrinter = allPrinters.mapLatest {\n it.isEmpty()\n}.asLiveData()\nRun Code Online (Sandbox Code Playgroud)\n它运行良好,但我不应该使用 StateFlow 吗?怎么做 ?因为stateIn()需要一个协程,而我下面的尝试不起作用。
val hasNoPrinter = …Run Code Online (Sandbox Code Playgroud) data-binding kotlin android-livedata kotlin-flow kotlin-stateflow
我目前正在学习新的 Android 堆栈(MVVM、compose、kotlin Flow/StateFlow),并且在调试值更新的 StateFlow 时遇到问题,但我没有从可组合项收集的迹象。
这是一个普遍的问题,但我通过自己的搜索没有找到任何解决我的问题的方法。
有人知道什么会干扰 StateFlow 吗?我让我的代码如下:
视图模型:
@HiltViewModel
class AuthViewModel @Inject constructor(
private val navigationManager: NavigationManager,
private val interactor: AuthInteractor
): BaseViewModel() {
companion object {
val TAG: String = AuthViewModel::class.java.simpleName
}
private val _uiState = MutableStateFlow(AuthenticationState())
val uiState: StateFlow<AuthenticationState> = _uiState
fun handleEvent(event: AuthenticationEvent) {
Log.v(TAG, "new event: $event")
when (event) {
is AuthenticationEvent.GoToRegistering -> navigateToRegistering()
is AuthenticationEvent.Register -> registerAccount(event)
is AuthenticationEvent.SnackbarMessage -> showSnackBar(event.message, event.type)
}
}
private fun navigateToRegistering() {
navigationManager.navigate(NavigationDirections.Authentication.registering)
}
private fun …Run Code Online (Sandbox Code Playgroud)