Template: let the ViewModel factory be agnostic of the host
This commit is contained in:
parent
35a6f90ed6
commit
1a307a0c4d
@ -20,8 +20,8 @@ data class ${fragmentArgsClass}() : Parcelable
|
|||||||
|
|
||||||
//TODO: add this fragment into FragmentModule
|
//TODO: add this fragment into FragmentModule
|
||||||
class ${fragmentClass} @Inject constructor(
|
class ${fragmentClass} @Inject constructor(
|
||||||
val viewModelFactory: ${viewModelClass}.Factory
|
private val viewModelFactory: ${viewModelClass}.Factory
|
||||||
) : VectorBaseFragment() {
|
) : VectorBaseFragment(), ${viewModelClass}.Factory by viewModelFactory {
|
||||||
|
|
||||||
<#if createFragmentArgs>
|
<#if createFragmentArgs>
|
||||||
private val fragmentArgs: ${fragmentArgsClass} by args()
|
private val fragmentArgs: ${fragmentArgsClass} by args()
|
||||||
|
@ -1,5 +1,6 @@
|
|||||||
package ${escapeKotlinIdentifiers(packageName)}
|
package ${escapeKotlinIdentifiers(packageName)}
|
||||||
|
|
||||||
|
import com.airbnb.mvrx.ActivityViewModelContext
|
||||||
import com.airbnb.mvrx.FragmentViewModelContext
|
import com.airbnb.mvrx.FragmentViewModelContext
|
||||||
import com.airbnb.mvrx.MvRxViewModelFactory
|
import com.airbnb.mvrx.MvRxViewModelFactory
|
||||||
import com.airbnb.mvrx.ViewModelContext
|
import com.airbnb.mvrx.ViewModelContext
|
||||||
@ -18,6 +19,7 @@ class ${viewModelClass} @AssistedInject constructor(@Assisted initialState: ${vi
|
|||||||
<#else>
|
<#else>
|
||||||
: VectorViewModel<${viewStateClass}, ${actionClass}, EmptyViewEvents>(initialState) {
|
: VectorViewModel<${viewStateClass}, ${actionClass}, EmptyViewEvents>(initialState) {
|
||||||
</#if>
|
</#if>
|
||||||
|
|
||||||
@AssistedInject.Factory
|
@AssistedInject.Factory
|
||||||
interface Factory {
|
interface Factory {
|
||||||
fun create(initialState: ${viewStateClass}): ${viewModelClass}
|
fun create(initialState: ${viewStateClass}): ${viewModelClass}
|
||||||
@ -27,8 +29,11 @@ class ${viewModelClass} @AssistedInject constructor(@Assisted initialState: ${vi
|
|||||||
|
|
||||||
@JvmStatic
|
@JvmStatic
|
||||||
override fun create(viewModelContext: ViewModelContext, state: ${viewStateClass}): ${viewModelClass}? {
|
override fun create(viewModelContext: ViewModelContext, state: ${viewStateClass}): ${viewModelClass}? {
|
||||||
val fragment: ${fragmentClass} = (viewModelContext as FragmentViewModelContext).fragment()
|
val factory = when (viewModelContext) {
|
||||||
return fragment.viewModelFactory.create(state)
|
is FragmentViewModelContext -> viewModelContext.fragment as? Factory
|
||||||
|
is ActivityViewModelContext -> viewModelContext.activity as? Factory
|
||||||
|
}
|
||||||
|
return factory?.create(state) ?: error("You should let your activity/fragment implements Factory interface")
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -30,6 +30,10 @@ import io.reactivex.Single
|
|||||||
abstract class VectorViewModel<S : MvRxState, VA : VectorViewModelAction, VE : VectorViewEvents>(initialState: S)
|
abstract class VectorViewModel<S : MvRxState, VA : VectorViewModelAction, VE : VectorViewEvents>(initialState: S)
|
||||||
: BaseMvRxViewModel<S>(initialState, false) {
|
: BaseMvRxViewModel<S>(initialState, false) {
|
||||||
|
|
||||||
|
interface Factory<S: MvRxState> {
|
||||||
|
fun create(state: S): BaseMvRxViewModel<S>
|
||||||
|
}
|
||||||
|
|
||||||
// Used to post transient events to the View
|
// Used to post transient events to the View
|
||||||
protected val _viewEvents = PublishDataSource<VE>()
|
protected val _viewEvents = PublishDataSource<VE>()
|
||||||
val viewEvents: DataSource<VE> = _viewEvents
|
val viewEvents: DataSource<VE> = _viewEvents
|
||||||
|
Loading…
x
Reference in New Issue
Block a user