标签: kotlin-stateflow

Room 分页无法正确地将 Flow<PagingData<Model>> 与其他流合并

我正在尝试使用Paging 3库来获取Flow<PagingData<Scan>>Room然后检查是否在 recyclerview 中选择了项目,因此我将此类映射到另一个名为 的类ScanMapper。为了实现此映射,每当用户将某个项目标记为选定时,我都会MapMutableStateFlow<Map<Int, State>>. 这里Map查找 anIndex(Int)得到StateState只是一个enum代表 State 的类UNINITIALISEDUSELECTED并且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

更新了刀 …

android kotlin-coroutines android-paging-3 kotlin-stateflow

2
推荐指数
1
解决办法
2581
查看次数

LiveData 是热的还是冷的?

我们知道StateFlow和SharedFlow很热门。

\n
\n

StateFlow 是一个热流\xe2\x80\x94,只要该流被收集\n或者垃圾收集根中存在对其的任何其他引用,它就会保留在内存中。

\n
\n
\n

SharedFlow 是一个热流,它向所有从其收集的使用者发送值。\n

\n
\n

水流本身是冷的。

\n
\n

流是类似于序列的冷流......

\n
\n

我有一个问题无法找到直接答案。LiveData 是热的还是冷的?

\n

android android-livedata kotlin-flow kotlin-stateflow kotlin-sharedflow

2
推荐指数
1
解决办法
2268
查看次数

StateFlow 在一个协程中进行收集

我尝试在一个协程中初始化三个收集,但仅第一个起作用。仅当我设置在不同的协程中收集其工作时。为什么?

  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)

android kotlin kotlin-coroutines kotlin-stateflow

1
推荐指数
1
解决办法
1991
查看次数

当过滤器需要更改时重新运行 StateFlow?

我有一个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设置的初始值。

kotlin kotlin-flow kotlin-stateflow

1
推荐指数
1
解决办法
1624
查看次数

Android Flow/StateFlow 和数据绑定/Room

我正在尝试弄清楚流/状态流和数据绑定。

\n

在我的项目中,我有 Room 中的“打印机”列表,以及 SharedPreferences 中的“默认打印机”的 ID。

\n

这是我的架构:\n在此输入图像描述

\n

1\xc2\xb0/ 问题:我在这个架构中表现良好?

\n

我是否使用了良好的流程并做得很好,还是出了什么问题?

\n

2\xc2\xb0/ 第一个问题:在我的列表中获取我的默认打印机

\n

房间给我一个Flow<List<Printer>>。借助我的适配器,我将其显示在回收器视图中viewModel.allPrinters.collect

\n

但是,当我想从房间绑定资源时,绑定“需要”LiveData 或 StateFlow,这是我的困难,因为 stateIn 需要协程。

\n

我怎样才能从我的默认打印机Flow<List<Printer>>(通过他的属性“id”在列表中找到它)并确保列表/项目是否更新,我的参考也将获得更新?\n如果我更改打印机的名称defaultPrinter并将其更新到 room(感谢我的存储库/room DAO),我希望在我的对象defaultPrinter和列表中更改名称。

\n

您还可以确认我的变量类型defaultPrinter应该是StateFlow<Printer?>

\n

注意:当我更新项目时,printerRoomDAO.update(item:Printer)我必须传递数据对象的副本Printer(新引用),否则我的 UI 将不会更新。

\n

3\xc2\xb0/ 第二个问题:使用状态流看起来很复杂

\n

isPrinterListEmpty这是我的 ViewModel 中的示例

\n
val hasNoPrinter = allPrinters.mapLatest {\n    it.isEmpty()\n}.asLiveData()\n
Run Code Online (Sandbox Code Playgroud)\n

它运行良好,但我不应该使用 StateFlow 吗?怎么做 ?因为stateIn()需要一个协程,而我下面的尝试不起作用。

\n
val hasNoPrinter = …
Run Code Online (Sandbox Code Playgroud)

data-binding kotlin android-livedata kotlin-flow kotlin-stateflow

1
推荐指数
1
解决办法
2643
查看次数

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)

android kotlin android-jetpack-compose kotlin-stateflow

0
推荐指数
1
解决办法
1920
查看次数