Skip to content
This repository was archived by the owner on Jan 10, 2025. It is now read-only.
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -29,7 +29,7 @@ import retrofit2.Retrofit
import retrofit2.converter.gson.GsonConverterFactory
import javax.inject.Singleton

@Module(includes = [ViewModelModule::class])
@Module
class AppModule {
@Singleton
@Provides
Expand Down

This file was deleted.

This file was deleted.

Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,6 @@ import androidx.databinding.DataBindingUtil
import androidx.fragment.app.Fragment
import androidx.fragment.app.viewModels
import androidx.lifecycle.Observer
import androidx.lifecycle.ViewModelProvider
import androidx.navigation.fragment.FragmentNavigatorExtras
import androidx.navigation.fragment.findNavController
import androidx.navigation.fragment.navArgs
Expand All @@ -38,6 +37,7 @@ import com.android.example.github.databinding.RepoFragmentBinding
import com.android.example.github.di.Injectable
import com.android.example.github.ui.common.RetryCallback
import com.android.example.github.util.autoCleared
import com.android.example.github.viewmodel.GithubViewModelFactory
import javax.inject.Inject

/**
Expand All @@ -46,7 +46,7 @@ import javax.inject.Inject
class RepoFragment : Fragment(), Injectable {

@Inject
lateinit var viewModelFactory: ViewModelProvider.Factory
lateinit var viewModelFactory: GithubViewModelFactory<RepoViewModel>

val repoViewModel: RepoViewModel by viewModels {
viewModelFactory
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -30,7 +30,6 @@ import androidx.databinding.DataBindingUtil
import androidx.fragment.app.Fragment
import androidx.fragment.app.viewModels
import androidx.lifecycle.Observer
import androidx.lifecycle.ViewModelProvider
import androidx.navigation.fragment.findNavController
import androidx.recyclerview.widget.LinearLayoutManager
import androidx.recyclerview.widget.RecyclerView
Expand All @@ -42,13 +41,14 @@ import com.android.example.github.di.Injectable
import com.android.example.github.ui.common.RepoListAdapter
import com.android.example.github.ui.common.RetryCallback
import com.android.example.github.util.autoCleared
import com.android.example.github.viewmodel.GithubViewModelFactory
import com.google.android.material.snackbar.Snackbar
import javax.inject.Inject

class SearchFragment : Fragment(), Injectable {

@Inject
lateinit var viewModelFactory: ViewModelProvider.Factory
lateinit var viewModelFactory: GithubViewModelFactory<SearchViewModel>

@Inject
lateinit var appExecutors: AppExecutors
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -38,6 +38,7 @@ import com.android.example.github.di.Injectable
import com.android.example.github.ui.common.RepoListAdapter
import com.android.example.github.ui.common.RetryCallback
import com.android.example.github.util.autoCleared
import com.android.example.github.viewmodel.GithubViewModelFactory
import com.bumptech.glide.load.DataSource
import com.bumptech.glide.load.engine.GlideException
import com.bumptech.glide.request.RequestListener
Expand All @@ -47,7 +48,7 @@ import javax.inject.Inject

class UserFragment : Fragment(), Injectable {
@Inject
lateinit var viewModelFactory: ViewModelProvider.Factory
lateinit var viewModelFactory: GithubViewModelFactory<UserViewModel>
@Inject
lateinit var appExecutors: AppExecutors

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -18,20 +18,13 @@ package com.android.example.github.viewmodel

import androidx.lifecycle.ViewModel
import androidx.lifecycle.ViewModelProvider

import javax.inject.Inject
import javax.inject.Provider
import javax.inject.Singleton

@Singleton
class GithubViewModelFactory @Inject constructor(
private val creators: Map<Class<out ViewModel>, @JvmSuppressWildcards Provider<ViewModel>>
class GithubViewModelFactory<VM : ViewModel> @Inject constructor(
private val vmProvider: Provider<VM>
) : ViewModelProvider.Factory {
override fun <T : ViewModel> create(modelClass: Class<T>): T {
val creator = creators[modelClass] ?: creators.entries.firstOrNull {
modelClass.isAssignableFrom(it.key)
}?.value ?: throw IllegalArgumentException("unknown model class $modelClass")
@Suppress("UNCHECKED_CAST")
return creator.get() as T
}

@Suppress("UNCHECKED_CAST")
override fun <T : ViewModel> create(modelClass: Class<T>): T = vmProvider.get() as T
}