HarmonyOS 鸿蒙Next中ViewModel(2)
HarmonyOS 鸿蒙Next中ViewModel(2)
向ViewModel传递参数:
1.修改MainViewModel
class MainViewModel(countReserved:Int) : ViewModel() {
var counter=countReserved
}
2.新建MainViewModelFactory继承ViewModelProvider.Factory向MainViewModel传递参数
class MainViewModelFactory(private val countReserved:Int): ViewModelProvider.Factory {
override fun <T: ViewModel>create (modelClass:Class<T>):T{
return MainViewModel(countReserved) as T
}
}
class MainActivity : AppCompatActivity() {
lateinit var viewModel:MainViewModel
lateinit var binding:ActivityMainBinding
lateinit var sp:SharedPreferences
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
enableEdgeToEdge()
binding=ActivityMainBinding.inflate(layoutInflater)
setContentView(binding.root)
ViewCompat.setOnApplyWindowInsetsListener(findViewById(R.id.main)) { v, insets ->
val systemBars = insets.getInsets(WindowInsetsCompat.Type.systemBars())
v.setPadding(systemBars.left, systemBars.top, systemBars.right, systemBars.bottom)
insets
}
sp=getPreferences(Context.MODE_PRIVATE)//初始化sp
val countReserved=sp.getInt("count_reserved",0)//第一个参数是键,第二个参数表示如果没有读到就返回默认值0
viewModel=ViewModelProvider(this,MainViewModelFactory(countReserved))
.get(MainViewModel::class.java)
binding.plusOneBtn.setOnClickListener{
viewModel.counter++
refreshCounter()
}
binding.clearBtn.setOnClickListener {
viewModel.counter=0
refreshCounter()
}
refreshCounter()
}
//退出程序前把数据存储起来
override fun onPause() {
super.onPause()
sp.edit {
putInt("count_reserved",viewModel.counter)
}
}
更多关于HarmonyOS 鸿蒙Next中ViewModel(2)的实战教程也可以访问 https://www.itying.com/category-93-b0.html
在HarmonyOS Next中,ViewModel用于管理UI相关的数据,支持配置变更时数据持久化。ViewModel通过ohos.app.ability.ViewModel
类实现,与Ability生命周期绑定。使用ViewModelProvider
获取ViewModel实例,确保同一Ability的不同UI组件共享相同数据。ViewModel在Ability销毁时自动清理资源。支持@State
和@Link
装饰器实现数据与UI的双向绑定。可通过onActive()
和onInactive()
监听生命周期状态变化。
更多关于HarmonyOS 鸿蒙Next中ViewModel(2)的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html
在HarmonyOS Next中,ViewModel的参数传递方式与Android类似但略有不同。针对您提供的代码,以下是关键点分析:
- ViewModel构造参数传递是正确的,但HarmonyOS中推荐使用
LocalStorage
替代SharedPreferences:
// 初始化LocalStorage
val localStorage = LocalStorage.getShared(this, "count_data")
val countReserved = localStorage.getInt("count_reserved", 0)
- ViewModelProvider的获取方式在HarmonyOS中更简洁:
viewModel = ViewModelProvider(this, MainViewModelFactory(countReserved))
.get(MainViewModel::class.java)
- 数据持久化建议改用HarmonyOS的Preferences:
override fun onPause() {
super.onPause()
localStorage.putInt("count_reserved", viewModel.counter)
localStorage.flush()
}
主要差异在于HarmonyOS使用自己的持久化方案替代Android的SharedPreferences,但ViewModel的核心机制保持兼容。参数通过Factory传递的写法是完全一致的。