简述

本文主旨讲安卓的数据层,设计一些简单的数据与组件之间的交互,也就是绑定。api通信这个环境是app交互极为重要的,比那些代码的质量,以及后期维护新增开发大部分代码就是这个环节所衍生的。
不要去看官方文档,太繁琐了。有更好的方案基于kotlin实现viewmodel,那就是fragment-ktx。一句话总结fragment-ktx集成ViewModel、AndroidViewModel和SavedStateHandle。

安装插件

01ab1026f42c83d999cbeedf4ce8242.png

jvmTrage需要一点1.8以上

  1. android {
  2. compileSdkVersion 29
  3. buildToolsVersion "29.0.3"
  4. viewBinding {
  5. enabled = true
  6. }
  7. kotlinOptions {
  8. jvmTarget = 1.8
  9. }
  10. defaultConfig {
  11. applicationId "com.example.viewbinding"
  12. minSdkVersion 16
  13. targetSdkVersion 29
  14. versionCode 1
  15. versionName "1.0"
  16. testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
  17. }
  18. buildTypes {
  19. release {
  20. minifyEnabled false
  21. proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
  22. }
  23. }
  24. compileOptions {
  25. targetCompatibility = 1.8
  26. }
  27. }

创建一个数据模型

package com.example.viewbinding

import androidx.lifecycle.LiveData
import androidx.lifecycle.MutableLiveData
import androidx.lifecycle.ViewModel

class Data1Model: ViewModel() {
//    内部模型
    private val _number =MutableLiveData<Int>().also {
        it.value = 0
    }

//    对外模型
    val number:LiveData<Int> = _number

//    模型方法
    fun addOne(it:Int){
        _number.value = _number.value?.plus(1)
    }
}

注释:内部模型用来存储api返回的数据,对外模型存放那些可能通过交互,或者处理加工过的内部数据。至于模型方法则用来处理业务逻辑。

实现数据viewModel和数据绑定

package com.example.viewbinding

import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import android.os.PersistableBundle
import androidx.activity.viewModels
import androidx.lifecycle.Observer
import androidx.lifecycle.ViewModel
import com.example.viewbinding.databinding.ActivityMainBinding
import kotlinx.android.synthetic.main.fragment_blank.*

class MainActivity : AppCompatActivity() {
//    声明变量
    private lateinit var binding: ActivityMainBinding
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
//        接入插件
        binding = ActivityMainBinding.inflate(layoutInflater)
        setContentView(binding.root)
        val data1Model by viewModels<Data1Model>()

//        模型数据绑定
        data1Model.number.observe(this, Observer {
            binding.tit1.text = it.toString()
        })

//        模型事件版本
        binding.button.setOnClickListener({
            data1Model.addOne(1)
        })

    }

    override fun onStart() {
        super.onStart()
    }

}

注解:以上代码作为参考,局部的数据可能使用与当前的方法。但我认为viewMode的事件,数据直接绑定wml会更好。

ViewModel 的生命周期

ViewModel - 图2

Fragment下使用 viewModel

package com.example.viewbinding

import android.os.Bundle
import androidx.fragment.app.Fragment
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import androidx.fragment.app.viewModels
import androidx.lifecycle.Observer
import com.example.viewbinding.databinding.FragmentHomeBinding

/**
 * A simple [Fragment] subclass.
 */
class HomeFragment : Fragment() {
    private lateinit var binding: FragmentHomeBinding
    override fun onCreateView(
        inflater: LayoutInflater, container: ViewGroup?,
        savedInstanceState: Bundle?
    ): View? {
        // Inflate the layout for this fragment
        binding = FragmentHomeBinding.inflate(layoutInflater)\
//        引入数据模型
        val data1Model:Data1Model by viewModels<Data1Model>()
        binding.textView.text = data1Model.number.toString()
        data1Model.number.observe(viewLifecycleOwner, Observer {
            binding.textView.text = it.toString()
        })

        binding.button2.setOnClickListener({
            data1Model.addOne(1)
        })
        return  binding.root
    }

    override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
        super.onViewCreated(view, savedInstanceState)

    }

}