我正在开发一个具有音乐播放器功能的Android应用程序.现在一切正常,但我对自己的做法并不满意,所以我来到了这里
The app is 100% kotlin 100% compose. I am using a NavHost for navigation between composable screens.
主活动包含NavHost. NavHost包含每个屏幕的所有导航和可组合内容
每个屏幕(嗯,不是每个屏幕,但大多数)我使用的是一个PlayerScaffold,它传递了一个顶部栏和一个内容,它们正常地组成屏幕,但添加和更新了底部的迷你播放器(A La Spotify)和向上滑动的全屏模式播放器.
每个内容屏幕都有自己的视图模型,迷你播放器和完整播放器都有一个PlayerViewModel.
PlayerViewModel得到一个"Player"的实例,它是一个包含exoPlayer实例并执行所有播放操作的类.
Player类由Dagger Hilt实例化并在模块中定义:
@Module
@InstallIn(SingletonComponent::class)
abstract class PlayerModule {
@Binds
abstract fun bindPlayer(
playerImpl: PlayerImpl,
): Player
}
最重要的是,我有一个前台服务"PlayerService"来保存"Player"实例,当应用程序转到后台时,这样它就可以保留对玩家的引用,而不会被杀死.
我(现在已经解决)的问题是,PlayerViewModel和播放器的几个实例正在创建,因此,如果我开始在一个屏幕上播放一首歌,然后转到下一个屏幕,下一个屏幕中的播放器将不会正确更新.我通过在Application类中保留PlayerViewModel的一个实例来解决这个问题,这样就只创建了一个,但我对这种方法没有百分之百的把握.
我希望它的工作方式是每个合成屏幕都有一个PlayerViewModel的实例,但PlayerViewModel的实例对于所有的ViewModel都是相同的.
如果Player类被注释为"Singleton",为什么我会有几个实例?