| public open class AndroidViewModelFactory |
| private constructor( |
| private val application: Application?, |
| |
| |
| @Suppress("UNUSED_PARAMETER") unused: Int, |
| ) : NewInstanceFactory() { |
| |
| |
| * Constructs this factory. When a factory is constructed this way, a component for which |
| * [ViewModel] is created must provide an [Application] by [APPLICATION_KEY] in |
| * [CreationExtras], otherwise [IllegalArgumentException] will be thrown from [create] |
| * method. |
| */ |
| @Suppress("SingletonConstructor") |
| public constructor() : this(application = null, unused = 0) |
| |
| |
| * Constructs this factory. |
| * |
| * @param application an application to pass in [AndroidViewModel] |
| */ |
| @Suppress("SingletonConstructor") |
| public constructor(application: Application) : this(application, unused = 0) |
| |
| @Suppress("DocumentExceptions") |
| override fun <T : ViewModel> create(modelClass: Class<T>, extras: CreationExtras): T { |
| return if (application != null) { |
| create(modelClass) |
| } else { |
| val application = extras[APPLICATION_KEY] |
| if (application != null) { |
| create(modelClass, application) |
| } else { |
| |
| if (AndroidViewModel::class.java.isAssignableFrom(modelClass)) { |
| throw IllegalArgumentException( |
| "CreationExtras must have an application by `APPLICATION_KEY`" |
| ) |
| } |
| super.create(modelClass) |
| } |
| } |
| } |
| |
| @Suppress("DocumentExceptions") |
| override fun <T : ViewModel> create(modelClass: Class<T>): T { |
| return if (application == null) { |
| throw UnsupportedOperationException( |
| "AndroidViewModelFactory constructed " + |
| "with empty constructor works only with " + |
| "create(modelClass: Class<T>, extras: CreationExtras)." |
| ) |
| } else { |
| create(modelClass, application) |
| } |
| } |
| |
| @Suppress("DocumentExceptions") |
| private fun <T : ViewModel> create(modelClass: Class<T>, app: Application): T { |
| return if (AndroidViewModel::class.java.isAssignableFrom(modelClass)) { |
| try { |
| modelClass.getConstructor(Application::class.java).newInstance(app) |
| } catch (e: NoSuchMethodException) { |
| throw RuntimeException("Cannot create an instance of $modelClass", e) |
| } catch (e: IllegalAccessException) { |
| throw RuntimeException("Cannot create an instance of $modelClass", e) |
| } catch (e: InstantiationException) { |
| throw RuntimeException("Cannot create an instance of $modelClass", e) |
| } catch (e: InvocationTargetException) { |
| throw RuntimeException("Cannot create an instance of $modelClass", e) |
| } |
| } else super.create(modelClass) |
| } |
| |
| public companion object { |
| private var _instance: AndroidViewModelFactory? = null |
| |
| |
| * Retrieve a singleton instance of AndroidViewModelFactory. |
| * |
| * @param application an application to pass in [AndroidViewModel] |
| * @return A valid [AndroidViewModelFactory] |
| */ |
| @JvmStatic |
| public fun getInstance(application: Application): AndroidViewModelFactory { |
| if (_instance == null) { |
| _instance = AndroidViewModelFactory(application) |
| } |
| return _instance!! |
| } |
| |
| |
| * A [CreationExtras.Key] to query an application in which ViewModel is being created. |
| */ |
| @JvmField public val APPLICATION_KEY: Key<Application> = CreationExtras.Companion.Key() |
| } |
| } |
| ``` |