android LiveData未从工作室中的插件更新

jjhzyzn0  于 2023-03-11  发布在  Android
关注(0)|答案(1)|浏览(114)

我希望将存储库响应作为吐司传播给用户,因此我将实时数据侦听器放在创建后方法的Activity中

mainViewModel.toast.observe(this) {
            Log.d(TAG, "initViews: $it")
            if (it.notPropagated) {
                Toast.makeText(
                    this,
                    it.message,
                    if (!it.longToast) Toast.LENGTH_SHORT else Toast.LENGTH_LONG
                ).show()
                mainViewModel.setMessageToPropagated()
            }
        }

吐司是从数据库中获取的流创建的简单活动数据

val toast = mainRepository.getMessage().asLiveData(viewModelWorkerContext)

但是当我尝试使用insert来更改数据库中其他片段中的数据时,它实际上不会在更改时更新,只有当我重新启动应用程序时,它才从数据库中获取内容,并响应mainViewModel.setMessageToPropagated(),将消息更改为“used”,并触发livedata,没有问题。

@Dao
interface RoomDao {
    @Insert(onConflict = OnConflictStrategy.REPLACE)
    suspend fun setMessage(message: SingleTimeUserMessage)

    @Query("SELECT * FROM SingleTimeUserMessage WHERE notPropagated = true LIMIT 1")
    fun getMessageToPropagate(): Flow<SingleTimeUserMessage>

    @Query("SELECT * FROM SingleTimeUserMessage LIMIT 1")
    fun getMessageToPropagated(): SingleTimeUserMessage
}

最后,供应商

@Module
@InstallIn(SingletonComponent::class)
object RoomDatabase {
    @Provides
    @Singleton
    fun provideMainDatabase(app: Application): MainDatabase =
        Room.databaseBuilder(app, MainDatabase::class.java, "MainDatabase")
            .fallbackToDestructiveMigration()
            .build()

    @Singleton
    @Provides
    fun provideTvDao(database: MainDatabase): RoomDao {
        return database.tvDao()
    }
}

我读了很多关于这个问题的主题,它通常是通过让提供程序返回相同的数据库示例来解决的,但据我所知,我的提供程序应该总是返回相同的示例。任何想法和帮助都将不胜感激。

wz8daaqr

wz8daaqr1#

在我的代码中有一个错误,我不知道是这样工作的。我在所有的存储库上都有无用的注解

@Module
@InstallIn(ActivityRetainedComponent::class)

取下后,一切似乎运行得很好。
希望这能帮助将来遇到类似问题的人。

相关问题