kotlin 如何使用观察块外部观察到的实时数据

hc2pp10m  于 2022-11-25  发布在  Kotlin
关注(0)|答案(1)|浏览(138)

我想把观察到的LiveData放在一个列表中,而你把那个列表放在代码的其他地方。就像这样:

var listCategory = listOf<Category>()

        categoryViewModel.categories.observe(viewLifecycleOwner) {
            listCategory = it
        }
        
        //do something with listCategory

CategoryViewModel.kt

@HiltViewModel
class CategoryViewModel @Inject constructor(private val categoryDao: CategoryDao) :ViewModel() {
    private val categoryFlow = categoryDao.getCategoryFlow()
    val categories = categoryFlow.asLiveData()

    fun addCategory(name:String){
        viewModelScope.launch {
            categoryDao.insert(Category(name = name))
        }
    }
}

CategoryDao.kt

@Dao
interface CategoryDao {
    @Insert(onConflict = OnConflictStrategy.REPLACE)
    suspend fun insert(category: Category)

    @Update
    suspend fun update(category: Category)

    @Delete
    suspend fun delete(category: Category)

    @Query("SELECT * FROM category_table")
    fun getCategoryFlow(): Flow<List<Category>>
}

但是listCategory总是空的,我如何使用观察块之外的观察数据呢?

0x6upsns

0x6upsns1#

您的listCategory具有List<Category>类型,该类型是不可变的。它也被声明为val,这意味着您不能合法地使用listCategory = something。要允许突变和添加,您应该将其创建为如下的可变列表

val listCategory = mutableListOf<Category>()

然后,在观察块中,您可以

categoryViewModel.categories.observe(viewLifecycleOwner) {
    listCategory.addAll(it)
}

此外,我建议对observe块中的livedata及其依赖组件执行操作,以确保livedata更改将得到处理。

相关问题