狀態保存
有時為了以后恢復狀態,保存一個狀態是有必要的,一個十分常見的使用情況是由于配置更改或行程結束而重新創建的安卓Activity,如果是一個純安卓專案(不是多平臺),可以直接使用AndroidX的SavedStateRegistry,對于多平臺專案,可以使用Essenty庫中的StateKeeper,
保留物件
另一種使用情況是在作用域重新創建后保留物件實體,這在安卓的配置發生變化時很常見,如果是一個純安卓專案(不是多平臺),可以直接使用AndroidX的ViewModelStore 和 ViewModelProvider,對于多平臺專案,可以使用Essenty庫中的InstanceKeeper,
示例
保存Store的State
internal interface CalculatorStore : Store<Intent, State, Nothing> {
@Parcelize
data class State(
val isLoading: Boolean = false,
// 其他屬性
) : Parcelable
// 其他代碼
}
internal class CalculatorStoreFactory(private val storeFactory: StoreFactory) {
fun create(stateKeeper: StateKeeper): CalculatorStore =
object : CalculatorStore, Store<Intent, State, Nothing> by storeFactory.create(
name = "CounterStore",
initialState = stateKeeper.consume(key = "CalculatorStoreState") ?: State(),
executorFactory = ::ExecutorImpl,
reducer = ReducerImpl
) {
}.also {
stateKeeper.register(key = "CalculatorStoreState") {
it.state.copy(isLoading = false) // 可以在這里重置任何瞬時狀態
}
}
// 其他代碼
}
保留整個Store
import com.arkivanov.essenty.instancekeeper.InstanceKeeper
import com.arkivanov.mvikotlin.core.instancekeeper.getStore
class CalculatorController(instanceKeeper: InstanceKeeper) {
private val store: CalculatorStore =
instanceKeeper.getStore(::calculatorStore)
/*
* 創建一個CalculatorStore的實體,
* ?? 注意不要缺少任何依賴項,
*/
private fun calculatorStore(): CalculatorStore = // 創建一個Store
}
保留任意物件
import com.arkivanov.essenty.instancekeeper.InstanceKeeper
import com.arkivanov.essenty.instancekeeper.getOrCreate
class CalculatorController(instanceKeeper: InstanceKeeper) {
private val something: Something =
instanceKeeper.getOrCreate(::Something)
/*
* 將被保留的類實體,
* ?? 注意不要缺少任何依賴項,
*/
private class Something : InstanceKeeper.Instance {
override fun onDestroy() {
// 清理這里的所有資源
}
}
}
在安卓中創建StateKeeper
import com.arkivanov.essenty.statekeeper.stateKeeper
class MainActivity : AppCompatActivity() { // 與AndroidX Fragment相同
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
val stateKeeper = stateKeeper()
// 將StateKeeper傳給依賴項,
}
}
在安卓中創建InstanceKeeper
import com.arkivanov.essenty.instancekeeper.instanceKeeper
class MainActivity : AppCompatActivity() { // 與AndroidX Fragment相同
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
val instanceKeeper = instanceKeeper()
// 將InstanceKeeper傳給依賴項,
}
}
日志記錄
對于任何app,日志記錄總是必要的,MVIKotlin使用mvikotlin-logging模塊中的 LoggingStoreFactory包裝器來提供日志記錄功能,可以用自定義的Logger和LogFormatter替換默認的Logger和LogFormatter,
日志記錄是一種除錯工具,它可能會影響性能,理想情況下它不應該在生產環境中使用,
使用LoggingStoreFactory
假設我們有以下的Store工廠:
internal class CalculatorStoreFactory(private val storeFactory: StoreFactory) {
fun create(): CalculatorStore =
object : CalculatorStore, Store<Intent, State, Nothing> by storeFactory.create(
name = "CounterStore",
// ...
) {
}
// ...
}
它接受一個StoreFactory,并用它創建一個CalculatorStore的實體,現在在這里可以傳遞任何StoreFactory,因此,如果你想要增加日志記錄,只需要傳遞一個LoggingStoreFactory的實體:
val storeFactory = LoggingStoreFactory(DefaultStoreFactory)
CalculatorStoreFactory(storeFactory).create()
通常需要在主程式的某處定義一個全域的StoreFactory,并將它傳遞給所有依賴項,
可以參閱samples獲取更多示例,
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/440450.html
標籤:架構設計
