我正在开发一个具有音乐播放器功能的Android应用程序.现在一切正常,但我对自己的做法并不满意,所以我来到了这里

The app is 100% kotlin 100% compose. I am using a NavHost for navigation between composable screens. Here is a very badly diagram with the parts that are related to what I am interested

主活动包含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",为什么我会有几个实例?

推荐答案

我发现问题出在PlayerModule类中,我将其注释为

@InstallIn(SingletonComponent::class)

我没有阅读文档,我认为这意味着它会自动使模块中的所有内容都成为"Singleton",

将@Singleton添加到函数解决了这个问题.不需要在任何地方保留视图模型的实例,现在它可以按预期工作.

@Module
@InstallIn(SingletonComponent::class)
abstract class PlayerModule {

    @Singleton
    @Binds
    abstract fun bindPlayer(
        playerImpl: PlayerImpl,
    ): Player
}

Android相关问答推荐

编写视觉转型

Android Studio中的Kotlin版本不兼容错误:需要元数据1.9.0,但找到1.6.0

在Android Studio中,如何在BuildSrc Dependenices Kotlin文件中指定时标记与旧版本的依赖关系

BroadCastReceiver的onReceive方法中的Intent上的Extras为空

Android App Google AdMob";广告加载失败:3;带有测试ID,&q;广告加载失败:1 for My Gahad

在Delphi中使用OpenCV for Android在使用JLIST时抛出错误

在Jetpack Compose中将导航绘图显示在顶部栏下方、底部栏上方

如何使用react native下载android中/data/data/[应用程序包名称文件夹]/files中的文件

expo 上的 socket.io 无法从 Android 连接

Jetpack Compose 中的用户在线指示器

当 Firebase Firestore 发生变化时,Kotlin ViewModel 不会更新

在 Jetpack Compose 中对齐行项目

如何像 XML 一样在 Compose Android Studio 中折叠/展开小部件代码区域/区域

组成不重叠的元素

在 Jetpack Compose 中更改列中子项的对齐方式

CenterAlignedTopAppBar 滚动行为:未为参数状态传递值

如果我在网络请求中指定它们是否与判断网络功能相关

Сan 无法从 Firestore 获取数据,没有错误

WearOS - 有没有办法从心电图传感器收集原始数据?

使用 Android 字符串数组在 Room 中迁移