我的 Android 应用程序中有以下 viewModel 代码
fun perform(operation: Action.Operation, sideEffects: (List<SideEffect>) -> Unit, render: (Reaction<String>) -> Unit): IO<Unit> = IO.fx {
!effect(Dispatchers.Main) { sideEffects(operation.sideEffects) }
val response = !effect(Dispatchers.IO) { repository.network(operation) }
!effect(Dispatchers.Main) { sideEffects(response.sideEffects) }
!effect(Dispatchers.Main) { render(response) }
}
wheresideEffects
和render
函数与调用 Activity 类似
private val sideEffects: (List<SideEffect>) -> Unit = { sideEffects ->
sideEffects.forEach { sideEffect ->
Timber.e("$sideEffect")
val exhaustive = when (sideEffect) {
is SideEffect.UiSideEffect.Inactive -> {
mProgressBar.visibility = View.GONE
}
is SideEffect.UiSideEffect.Active -> {
mProgressBar.visibility = View.VISIBLE
}
is SideEffect.UiSideEffect.Enable -> Timber.d("SIDE EFFECT:: TODO() $sideEffect")
is SideEffect.UiSideEffect.Disable -> Timber.d("SIDE EFFECT:: TODO() $sideEffect")
is SideEffect.Logging.Log -> Timber.d("SIDE EFFECT:: {logging} ${sideEffect.message}")
is SideEffect.Analytical.Analytics -> Timber.d("SIDE EFFECT:: TODO() $sideEffect")
}
}
}
我的活动从其 onCreate() 方法调用 perform 方法
private lateinit var viewModel: MainViewModel
private lateinit var textView: TextView
private lateinit var mProgressBar: ProgressBar
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
textView = findViewById(R.id.hello_world_tv)
mProgressBar = findViewById(R.id.progress_bar_cyclic)
viewModel = ViewModelProviders.of(this)[MainViewModel::class.java]
val cancel = viewModel.perform(Action.Operation(), sideEffects, render).unsafeRunAsyncCancellable { either ->
when (either) {
is Either.Left -> {
Timber.e("oh Dear!!!! ${either.a}")
//Show Error!!!
}
is Either.Right -> {
Timber.e("Everything Worked correctly ${either.b}")
}
}
}
}
这是一种安全的方法吗?
我将对我的 TextView 和 ProgressBar 的引用传递到我的 viewModel 中是否重要?