使用匕首柄为 class 注入依赖项

Inject dependency for a class using dagger hilt

MainActivityViewModel.kt:

class MainActivityViewModel(
    var musicPlaybackConnection: MusicPlaybackConnection
) : ViewModel() {

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

MusicPlaybackConnection.kt

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:

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

class MyService: MediaBrowserServiceCompat(){}

更新: @ViewModelInject 太旧了,所以使用下面的代码来注入 viewModel。

@HiltViewModel
class MainActivityViewModel @Inject constructor( private val _playbackConnection: MusicPlaybackConnection) : ViewModel() {
  ...
}

首先为什么要在 main activity 中注入 viewModel?

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

private val mainActivityViewModel: MainActivityViewModel by viewModels()

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

但是无论如何如果你想注入viewmodel

你应该先提供viewModel来提供viewmodel至少你需要有lifecycle owner,可以是activity或fragment

如果需要在MainActivityViewModel

中注入Mu​​sicPlaybackConnection

您需要提供Mu​​sicPlaybackConnection

@ActivityScoped
@Provides
fun provideMusicPlaybackConnection(
                       @ActivityContext context: Context,
                       serviceComponentName: ComponentName): MusicPlaybackConnection =
    MusicPlaybackConnection(context, serviceComponentName)

然后在 MainActivityViewModel class

 class MainActivityViewModel @ViewModelInject constructor(
    private val _playbackConnection: MusicPlaybackConnection) : ViewModel() {
          ...
    }

希望我的回答对您有所帮助