Kotlin Jetpack组件ViewModel使用详解

目录
  • 1.ViewModel的出现
  • 2.ViewModel的使用
    • 基本步骤
    • ViewModel的作用

1.ViewModel的出现

ViewModel应该是Jetpack中最重要的组件之一了。在以前,Activity要负责逻辑处理,又要控制UI展示,还要处理网络回调,导致大型项目难以维护。于是,ViewModel来帮助Activity分担一部分工作,ViewModel就专门用于存放和界面相关的工作。

2.ViewModel的使用

基本步骤

在app/build.gradel文件添加依赖

dependencies{
   ...
   implementation "androidx.lifecycle:lifecycle-extensions:2.2.0"
}

创建ViewModel的子类

class MainViewModel:ViewModel(){
   var counter=0
}

在MainActivity中创建ViewModel的实例

viewModel=ViewModelProvider(this).get(MainViewModel::class.java)

ViewModel的作用

手机发生横纵屏旋转的时候,存放在Activity的数据不会丢失。

由图一可以看出ViewModel的生命周期比Activity的生命周期长,所以Activity旋转的时候,ViewModel的数据任然存在。

图一:

下面我们通过普通的计算器来实现这个功能

在界面上添加一个按钮,每点击一次按钮就让计算器加1,并且把最新的计数显示在页面上,运行完成后,不管你怎样翻转,页面的数据不会丢失。

在布局文件中添加按钮和TextView

<TextView
        android:id="@+id/infoText"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="center_horizontal"
        android:textSize="32sp" />
 <Button
        android:id="@+id/plusOneBtn"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_gravity="center_horizontal"
        android:text="Plus One"/>

创建ViewModel的子类

class MainViewModel: ViewModel() {
    var counter=0
}

在MainActivity中调用ViewModel的实例,每点击一次按钮就让计算器加1。

class MainActivity : AppCompatActivity() {
    lateinit var viewModel: MainViewModel
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
        viewModel=ViewModelProvider(this).get(MainViewModel::class.java)
        val plusOneBtn:Button=findViewById(R.id.plusOneBtn)
        plusOneBtn.setOnClickListener {
            viewModel.counter++
            refreshCounter()
        }
        refreshCounter()
    }
    private fun refreshCounter() {
        val infoText:TextView=findViewById(R.id.infoText)
        infoText.text=viewModel.counter.toString()
    }
}

退出程序后再打开,页面数据不会丢失。

实现这个功能,我们需要在退出程序的时候对当前这个计数进行保存,然后在重新打开这个程序的时候读取之前保存的计数,并将这个计数作为参数传递给MainViewModel。

创建ViewModel的子类,给MainViewModel的构造函数添加参数

class MainViewModel(countReserved:Int): ViewModel() {
    var counter=countReserved
}

创建ViewModelProvider.Factory的子类,在这个类里面创建ViewModel的实例并且给ViewModel的构造函数赋值。

class MainViewModelFactory(private val countReserved:Int): ViewModelProvider.Factory {
    override fun <T : ViewModel?> create(modelClass: Class<T>): T {
        return MainViewModel(countReserved) as T
        //这个create方法的执行事件和Activity的生命周期无关,所以可以直接使用MainViewModel来创建实例
    }
}

退出程序的时候对当前这个计数进行保存,然后在重新打开这个程序的时候读取之前保存的计数,并将这个计数作为参数传递给MainViewModel,每点击一次按钮就让计算器加1,并且把最新的计数显示在页面上。

class MainActivity : AppCompatActivity() {
    lateinit var viewModel: MainViewModel
    lateinit var sp:SharedPreferences
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
        val countReserved=sp.getInt("count_reserved",0)
        viewModel=ViewModelProvider(this,MainViewModelFactory(countReserved)).get(MainViewModel::class.java)
        sp=getSharedPreferences("data",Context.MODE_PRIVATE)
        val plusOneBtn:Button=findViewById(R.id.plusOneBtn)
        plusOneBtn.setOnClickListener {
            viewModel.counter++
            refreshCounter()
        }
        refreshCounter()
    }
    override fun onPause() {
        super.onPause()
        sp.edit().putInt("count_reserved",viewModel.counter)
    }
    private fun refreshCounter() {
        val infoText:TextView=findViewById(R.id.infoText)
        infoText.text=viewModel.counter.toString()
    }
}

到此这篇关于Kotlin Jetpack组件ViewModel使用详解的文章就介绍到这了,更多相关Kotlin ViewModel内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • Jetpack Compose实现对角线滚动效果

    目录 缘起 初试 探索 学习 FreeScrollState freeScroll 总结 缘起 不久前刷到 newki 前辈的文章,用自定义 viewGroup的方式实现了如图效果: Android自定义ViewGroup嵌套与交互实战,幕布全屏滚动效果 我当时的反应: new bee ! new bee ! 这效果不错 初试 大佬用 Android View 出来了,那能否用 Google 新一代 UI Compose 来整一个呢? 正好手上有本 fun 神写得书 <Jetpack Compo

  • 移动端开发之Jetpack Hilt技术实现解耦

    目录 Hilt是什么 Hilt使用地方 依赖注入(DI)概念 Hilt使用 导入 Hilt是什么 Hilt 是基于 Dagger2 的针对 Android场景定制化 的框架. 这有点像什么? RxAndroid 是 RxJava 的Android平台定制化扩展.Andorid虽然由Java.Kotlin构成,但是它有很多平台的特性,比如它有 Java开发 所不知道的 Context 等. Dagger框架虽然很出名,在国外也很流行,但是在国内使用其的App少之又少,列举一些缺点: 上手难,众多A

  • Android Jetpack组件ViewModel基本用法详解

    目录 引言 一.概述与作用 二.基本用法 小结 引言 天道好轮回,终于星期五,但是还是忙碌了一天.在项目中,我遇到了一个问题,起因则是无法实时去获取信息来更新UI界面,因为我需要知道我是否获取到了实时信息,我想到的办法有三,利用Handler收发消息在子线程与主线程切换从而更新信息,其二则是利用在页面重绘的时候(一般是页面变动如跳转下个页面和将应用切至后台),其三就是利用Jetpack中最重要的组件之一ViewModel,最后我还是选择了ViewModel,因为感觉更方便. 其实想到的前面两个方

  • JetpackCompose Scaffold组件使用教程

    目录 搭设基本Scaffold页面 准备工作 主体编写 搭设基本Scaffold页面 scaffold 组件遵循 Material Design,可以协助开发者迅速构建对应框架页面 准备工作 首先在 drawable 文件夹内,添加几张 vector images,用作我们的底部导航栏图标 在主页面中声明数据类,表示单个图标以及其解释文本 data class Item( val name: String, val icon: Int ) 新增组件 mainBody,逐一添加三个底部按钮的图标

  • JetpackCompose Navigation导航实现流程

    目录 Navigation 快速上手 编写欲跳转的两个页面 路由表配置 总路由 主页面调用总路由 跳转逻辑完善 Navigation 快速上手 下面案例简要展示使用 Compose 版本的 Navigation 库来实现两个页面之间的跳转 这是完整的结构(忽略掉红线划过的那个包) 编写欲跳转的两个页面 编写 Demo1 页面 子页面使用多个 composable 组件相组合的方法一一装配起来 Demo1main 渲染整个页面,他接受一个 NavController 对象,用于操纵导航相关的方法

  • 官网项目Jetpack Startup库学习

    目录 简单认识一下Startup 项目代码 简单认识一下Startup nowinandroid项目作为目前google官方来演示MAD(现代Android开发技术)的示例项目,里面大量依赖运用了jetpack包下的各种库.通过分析学习这些库在项中的实际使用可以帮助我们比直接阅读库的文档来更好的理解和学习.希望通过学习后可以帮助到我们能熟练地在我们自己的项目中正确高效的使用到jetpack里面的各种强大库.不废话了,下面进入我们今天的正题——Startup App Startup  |  And

  • Kotlin Jetpack组件ViewModel使用详解

    目录 1.ViewModel的出现 2.ViewModel的使用 基本步骤 ViewModel的作用 1.ViewModel的出现 ViewModel应该是Jetpack中最重要的组件之一了.在以前,Activity要负责逻辑处理,又要控制UI展示,还要处理网络回调,导致大型项目难以维护.于是,ViewModel来帮助Activity分担一部分工作,ViewModel就专门用于存放和界面相关的工作. 2.ViewModel的使用 基本步骤 在app/build.gradel文件添加依赖 depe

  • Kotlin 嵌套函数开发技巧详解

    目录 1.嵌套函数 2.@JvmOverloads快捷实现函数重载 3.延迟初始化lateinit var 4.@JvmField减少属性set和get方法的生成 1.嵌套函数 业务开发中,我们可能会遇到这样一个场景:一个函数只会被某一处多次调用,且不想让这个函数在该类的其他地方调用,这个时候就需要对这个函数的访问性进行进一步限制. private是无法满足的,这个时候我们就可以使用嵌套函数提供更好的封装: fun test1() { //被限制访问行的函数 fun test2(content:

  • Angular2 组件交互实例详解

    1. 组件通信 我们知道Angular2应用程序实际上是有很多父子组价组成的组件树,因此,了解组件之间如何通信,特别是父子组件之间,对编写Angular2应用程序具有十分重要的意义,通常来讲,组件之间的交互方式主要有如下几种: l 使用输入型绑定,把数据从父组件传到子组件 l 通过 setter 拦截输入属性值的变化 l 使用 ngOnChanges 拦截输入属性值的变化 l 父组件监听子组件的事件 l 父组件与子组件通过本地变量互动 l 父组件调用 ViewChild l 父组件和子组件通过服

  • Kotlin开发Android应用实例详解

    Kotlin开发Android应用实例详解 相关文章:关于Kotlin语言的基础介绍: http://www.jb51.net/article/114086.htm 我们简单的知道了Kotlin这门新语言的优势,也接触了一些常见的语法及其简单的使用,相信你会对它有浓厚的兴趣,暂且理解为对它感兴趣吧,哈哈哈.那么,我们该如何在Android中应用这门新的语言呢?今天的这篇文章带你学习使用Kotlin开发Android应用,并对比我们传统语言Java,让你真真切切的感受到他的美和优雅. 配置 项目g

  • 微信小程序组件 marquee实例详解

    微信小程序组件 marquee实例详解 1. marquee标签 html是有marquee标签的,可以实现跑马灯效果,但小程序没有,所以要实现.这里考虑使用css3的animation实现. html的marquee是这样使用的. <marquee direction="left" behavior="scroll" scrollamount="1" scrolldelay="0" loop="-1"

  • Hibernate组件映射代码详解

    本文研究的主要是Hibernate组件映射的相关内容,具体如下. 组件关联映射的属性是复杂类型的持久化类,但不是实体类,即数据库中没有表与该属性对应,但该类的属性要持久保存. 比如:外国人的名字name分为firstName和lastName. MyName.java: public class MyName { private String firstName; private String lastName; public String getFirstName() { return fir

  • 基于vue2.0动态组件及render详解

    如下所示: <template> <div class="hello"> <h1>{{ msg }}</h1> <h2>这里是Boor</h2> <component v-bind:my-data="items" v-bind:is="currentView"> <!-- 组件在 vm.currentview 变化时改变! --> </compo

  • vue组件与复用详解

    一.什么是组件 组件 (Component) 是 Vue.js 最强大的功能之一.组件可以扩展 HTML 元素,封装可重用的代码. 二.组件用法 组件需要注册后才可以使用,注册有全局注册和局部注册两种方式. 2.1 全局注册后,任何V ue 实例都可以使用.如: <div id="app1"> <my-component></my-component> </div> Vue.component('my-component',{ templ

  • vue全局组件与局部组件使用方法详解

    vue全局/局部注册,以及一些混淆的组件 main.js入口文件的一些常用配置, 在入口文件上定义的public.vue为全局组件,在这里用的是pug模版 .wraper 的形式相当于<div class=wraper></div> -main.js文件 **main.js入口文件的内容** import Vue from 'vue' import App from './App' import router from './router' // 引入公用组件的vue文件 他暴漏的

随机推荐