Merge pull request #210 from TouchInstinct/mvi_change_on_interface

Mvi change on interface
This commit is contained in:
rinstance 2021-08-17 00:26:22 +03:00 committed by GitHub
commit 3c1342aad8
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 82 additions and 63 deletions

View File

@ -0,0 +1,80 @@
package ru.touchin.roboswag.mvi_arch.core
import android.os.Parcelable
import android.view.View
import ru.touchin.extensions.setOnRippleClickListener
import ru.touchin.roboswag.mvi_arch.marker.ViewAction
import ru.touchin.roboswag.mvi_arch.marker.ViewState
/**
* Interface with the main MVI methods and fields
*/
interface IMvi<NavArgs, State, Action, VM>
where NavArgs : Parcelable,
State : ViewState,
Action : ViewAction,
VM : MviViewModel<NavArgs, Action, State> {
/**
* Use [viewModel] extension to get an instance of your view model class.
*/
val viewModel: VM
/**
* Use this method to subscribe on view state changes.
*
* You should render view state here.
*
* Must not be called before [onAttach] and after [onDetach].
*/
fun renderState(viewState: State) {}
/**
* Use this method to dispatch view actions to view model.
*/
fun dispatchAction(actionProvider: () -> Action) {
viewModel.dispatchAction(actionProvider.invoke())
}
/**
* Use this method to dispatch view actions to view model.
*/
fun dispatchAction(action: Action) {
viewModel.dispatchAction(action)
}
fun addOnBackPressedCallback(actionProvider: () -> Action) {
addOnBackPressedCallback(actionProvider.invoke())
}
fun addOnBackPressedCallback(action: Action)
/**
* Simple extension for dispatching view events to view model with on click.
*/
fun View.dispatchActionOnClick(actionProvider: () -> Action) {
setOnClickListener { dispatchAction(actionProvider) }
}
/**
* Simple extension for dispatching view events to view model with on click.
*/
fun View.dispatchActionOnClick(action: Action) {
setOnClickListener { dispatchAction(action) }
}
/**
* Simple extension for dispatching view events to view model with on ripple click.
*/
fun View.dispatchActionOnRippleClick(actionProvider: () -> Action) {
setOnRippleClickListener { dispatchAction(actionProvider) }
}
/**
* Simple extension for dispatching view events to view model with on ripple click.
*/
fun View.dispatchActionOnRippleClick(action: Action) {
setOnRippleClickListener { dispatchAction(action) }
}
}

View File

@ -12,7 +12,6 @@ import androidx.fragment.app.Fragment
import androidx.lifecycle.Observer
import androidx.lifecycle.ViewModel
import androidx.lifecycle.ViewModelProvider
import ru.touchin.extensions.setOnRippleClickListener
import ru.touchin.roboswag.mvi_arch.di.ViewModelAssistedFactory
import ru.touchin.roboswag.mvi_arch.di.ViewModelFactory
import ru.touchin.roboswag.mvi_arch.marker.ViewAction
@ -47,7 +46,7 @@ import javax.inject.Inject
*/
abstract class MviFragment<NavArgs, State, Action, VM>(
@LayoutRes layout: Int
) : BaseFragment<BaseActivity>(layout)
) : BaseFragment<BaseActivity>(layout), IMvi<NavArgs, State, Action, VM>
where NavArgs : Parcelable,
State : ViewState,
Action : ViewAction,
@ -57,11 +56,6 @@ abstract class MviFragment<NavArgs, State, Action, VM>(
const val INIT_ARGS_KEY = "INIT_ARGS"
}
/**
* Use [viewModel] extension to get an instance of your view model class.
*/
protected abstract val viewModel: VM
/**
* Used for smooth view model injection to this class.
*/
@ -86,34 +80,7 @@ abstract class MviFragment<NavArgs, State, Action, VM>(
viewModel.state.observe(viewLifecycleOwner, Observer(this::renderState))
}
/**
* Use this method to subscribe on view state changes.
*
* You should render view state here.
*
* Must not be called before [onAttach] and after [onDetach].
*/
protected open fun renderState(viewState: State) {}
/**
* Use this method to dispatch view actions to view model.
*/
protected fun dispatchAction(actionProvider: () -> Action) {
viewModel.dispatchAction(actionProvider.invoke())
}
/**
* Use this method to dispatch view actions to view model.
*/
protected fun dispatchAction(action: Action) {
viewModel.dispatchAction(action)
}
protected fun addOnBackPressedCallback(actionProvider: () -> Action) {
addOnBackPressedCallback(actionProvider.invoke())
}
protected fun addOnBackPressedCallback(action: Action) {
override fun addOnBackPressedCallback(action: Action) {
requireActivity().onBackPressedDispatcher.addCallback(viewLifecycleOwner, object : OnBackPressedCallback(true) {
override fun handleOnBackPressed() {
dispatchAction(action)
@ -137,32 +104,4 @@ abstract class MviFragment<NavArgs, State, Action, VM>(
).get(ViewModel::class.java)
}
/**
* Simple extension for dispatching view events to view model with on click.
*/
protected fun View.dispatchActionOnClick(actionProvider: () -> Action) {
setOnClickListener { dispatchAction(actionProvider) }
}
/**
* Simple extension for dispatching view events to view model with on click.
*/
protected fun View.dispatchActionOnClick(action: Action) {
setOnClickListener { dispatchAction(action) }
}
/**
* Simple extension for dispatching view events to view model with on ripple click.
*/
protected fun View.dispatchActionOnRippleClick(actionProvider: () -> Action) {
setOnRippleClickListener { dispatchAction(actionProvider) }
}
/**
* Simple extension for dispatching view events to view model with on ripple click.
*/
protected fun View.dispatchActionOnRippleClick(action: Action) {
setOnRippleClickListener { dispatchAction(action) }
}
}