首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用匕首柄为类注入依赖关系

使用匕首柄为类注入依赖关系
EN

Stack Overflow用户
提问于 2021-01-10 15:07:50
回答 1查看 1.5K关注 0票数 0
  • 我正试图在我的安卓应用程序中实现dagger-hilt。现在,我的应用程序中有四个类,但是我在为它创建依赖关系时感到困惑。

MainActivityViewModel.kt

代码语言:javascript
复制
class MainActivityViewModel(
    var musicPlaybackConnection: MusicPlaybackConnection
) : ViewModel() {

    fun hello() {
        Log.d("TAG", "${musicPlaybackConnection.isConnected.value}")
    }
}

MusicPlaybackConnection.kt

代码语言:javascript
复制
class MusicPlaybackConnection(
        private val context: Context,
        serviceComponentName: ComponentName
    ) {
        var isConnected = MutableLiveData<Boolean>().apply { postValue(false) }
 

    companion object {
        @Volatile
        private var instance: MusicPlaybackConnection? = null

        fun getInstance(context: Context, serviceComponentName: ComponentName) =
            instance ?: synchronized(this) {
                instance ?: MusicPlaybackConnection(context, serviceComponentName)
                    .also { instance = it }
        }
   }
}

MainActivity.kt

代码语言:javascript
复制
class MainActivity : AppCompatActivity() {
    
    lateinit var mainActivityViewModel: MainActivityViewModel

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(view)

       mainActivityViewModel = ViewModelProvider(
         this, MainActivityModelFactory(
            MusicPlaybackConnection.getInstance(
                this,
                ComponentName(this, MyService::class.java)
            )
         )
       ).get(MainActivityViewModel::class.java)

        mainActivityViewModel.hello()
    }
}

MyService.kt

代码语言:javascript
复制
class MyService: MediaBrowserServiceCompat(){}

我想在MainActivity.

  • Note:中使用匕首柄注入MainActivityViewModel类,目前在上面的代码中,我已经在MainActivity中实例化了MainActivityViewModel,但我想使用dagger-hilt.

执行同样的操作。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-01-16 18:11:19

更新: @ViewModelInject已经很老了,所以使用下面的代码注入viewModel。

代码语言:javascript
复制
@HiltViewModel
class MainActivityViewModel @Inject constructor( private val _playbackConnection: MusicPlaybackConnection) : ViewModel() {
  ...
}

首先,为什么要在主活动中注入viewModel?

在活动或片段中初始化viewModel的最佳方法是:

代码语言:javascript
复制
private val mainActivityViewModel: MainActivityViewModel by viewModels()

使用implementation "androidx.core:core-ktx:X.Y.Z"依赖项

但是无论如何,如果您想要注入视图模型

您应该首先提供 viewmodel 来提供视图模型,至少您需要有生命周期所有者,它可以是活动或片段。

如果您需要在MusicPlaybackConnection中注入MainActivityViewModel

您需要提供MusicPlaybackConnection

代码语言:javascript
复制
@ActivityScoped
@Provides
fun provideMusicPlaybackConnection(
                       @ActivityContext context: Context,
                       serviceComponentName: ComponentName): MusicPlaybackConnection =
    MusicPlaybackConnection(context, serviceComponentName)

然后在MainActivityViewModel类中

代码语言:javascript
复制
 class MainActivityViewModel @ViewModelInject constructor(
    private val _playbackConnection: MusicPlaybackConnection) : ViewModel() {
          ...
    }

希望我的回答能帮到你。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/65654733

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档