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

2 回复

在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类似但略有不同。针对您提供的代码,以下是关键点分析:

  1. ViewModel构造参数传递是正确的,但HarmonyOS中推荐使用LocalStorage替代SharedPreferences:
// 初始化LocalStorage
val localStorage = LocalStorage.getShared(this, "count_data")
val countReserved = localStorage.getInt("count_reserved", 0)
  1. ViewModelProvider的获取方式在HarmonyOS中更简洁:
viewModel = ViewModelProvider(this, MainViewModelFactory(countReserved))
    .get(MainViewModel::class.java)
  1. 数据持久化建议改用HarmonyOS的Preferences:
override fun onPause() {
    super.onPause()
    localStorage.putInt("count_reserved", viewModel.counter)
    localStorage.flush()
}

主要差异在于HarmonyOS使用自己的持久化方案替代Android的SharedPreferences,但ViewModel的核心机制保持兼容。参数通过Factory传递的写法是完全一致的。

回到顶部