Android Compose 新闻App(二)ViewModel、Hlit、数据流

简介: Android Compose 新闻App(二)ViewModel、Hlit、数据流

前言


 在上一篇文章中我们构建了网络框架了,现在可以在页面中通过liveData的Observe回调中看到网络数据的返回。


正文


 Compose组件和Jetpack中其他的组件可以很有效的结合起来,会使我们的程序解耦的更彻底。下面来使用它们吧


一、添加依赖


添加依赖有两个部分,一个是Hilt的,一个是ViewModel。


① 添加Hilt依赖


 首先是在项目的build.gradle中,先定义Hilt的版本。


hilt_version = '2.38.1'


然后添加插件依赖:


dependencies {
        classpath "com.google.dagger:hilt-android-gradle-plugin:$hilt_version"
    }


添加位置如下图所示:


0421b4926c5e4f998aebfc0b5ab33d04.png


下面是在app的build.gradle中的配置:在顶部plugins{}闭包中添加:


id 'kotlin-kapt'
    id 'dagger.hilt.android.plugin'

e7dbaefe870b4421992cda9264333b22.png


这里增加hilt插件。然后在dependencies{}闭包中添加如下依赖:


implementation "com.google.dagger:hilt-android:$hilt_version"
    kapt "com.google.dagger:hilt-android-compiler:$hilt_version"


如下图所示:


30a7b1b7829a4866bb16fef5ca1ff810.png


至此我们Hilt依赖添加完毕。


②添加ViewModel依赖


下面我们添加ViewModel的依赖,其实主要就是对于在Compose使用ViewModel的增强,依赖如下:


implementation 'androidx.lifecycle:lifecycle-extensions:2.2.0'
    implementation "androidx.lifecycle:lifecycle-viewmodel-ktx:2.4.1"
    implementation "androidx.lifecycle:lifecycle-livedata-ktx:2.4.1"
    implementation "androidx.lifecycle:lifecycle-viewmodel-compose:2.4.1"
    implementation "androidx.compose.runtime:runtime-livedata:$compose_version"


添加位置如下:


43a6f4b4ebfd4b27bff7a2387acc1473.png


最后Sync Now,同步一下,然后你最好运行一下,先保证你添加的依赖没有问题,你再继续后面的开发比较好。


二、Hilt使用


 使用Hilt第一步就是添加@HiltAndroidApp注解,


a1bf216788b94fdfa67eb924d1b76aa5.png


这里的App类在上一篇文章中就已经写好了。然后我们定义EpidemicNewsRepository的作用域为@ViewModelScoped,并且注入。


e8e12e62ebde4aa4842328e1c203dfe3.png


定义了EpidemicNewsRepository在ViewModel中使用,下面在com.llw.goodnews包下新建viewmodel包,包下新建一个MainViewModel类,代码如下:


@HiltViewModel
class MainViewModel @Inject constructor(
    repository: EpidemicNewsRepository
) : ViewModel() {
    val result = repository.getEpidemicNews()
}


这里我们直接通过注入的方式在构造函数中传入EpidemicNewsRepository,然后通过repository去调用getEpidemicNews()函数,至此我们的ViewModel就写好了。


三、ViewModel使用


下面我们回到页面MainActivity中,创建一个initData函数


@Composable
fun initData(viewModel: MainViewModel = viewModel()) {
}


你会觉得很奇怪,这里说明一下,这里就是Compose和ViewModel的组合了,为什么这么说呢?


a3f1b118d5744093ac4ef8df8eb807db.png


 因为我如果不加@Composable注解,它就不是一个可组合函数,就不能这么使用。只要是可组合函数都可以调用viewModel() 函数去获取ViewModel,而我们这里的就是MainViewModel,viewModel() 会返回一个现有的 ViewModel,或在给定作用域内创建一个新的 ViewModel。只要该作用域处于有效状态,就会保留 ViewModel。例如,如果在某个 Activity 中使用了可组合项,则在该 Activity 完成或进程终止之前,viewModel() 会返回同一实例。这里的作用域很重要,因为普通函数如果没有作用域的话是无法调用可组合函数。


四、数据流


Compose 随附了一些扩展程序,它们适用于最热门的基于流的 Android 解决方案。其中每个扩展程序都由不同的工件提供:


LiveData.observeAsState() 包含在 androidx.compose.runtime:runtime-livedata:$composeVersion 工件中。

组件注册为监听器,并将值表示为 State。每当发出一个新值时,Compose 都会重组界面中使用该 state.value 的部分。


val dataState = viewModel.result.observeAsState()


通过这个代码会执行网络请求,观察返数据状态,得到一个dataState,


dataState.value?.let {
        val orNull = it.getOrNull()
        if (orNull != null) {
            Greeting(name = orNull.msg)
        }
    }


每当 dataState 有改变时,都会执行.let函数体中的代码。


d21a17796d1e44f590d2ab8d04cfb8fe.png


我们在页面中显示返回值,然后我们在setContent中调用initData(),这个网络数据返回再预览中是看不出来的,我们通过虚拟机去显示这个返回值。


623b0461f8cc4276892058c2f95a4f01.png


下一篇文章中,我们将使用Compose显示UI数据。


相关文章
|
1月前
|
XML Java 数据库
安卓项目:app注册/登录界面设计
本文介绍了如何设计一个Android应用的注册/登录界面,包括布局文件的创建、登录和注册逻辑的实现,以及运行效果的展示。
138 0
安卓项目:app注册/登录界面设计
|
2月前
|
Java 数据库 Android开发
一个Android App最少有几个线程?实现多线程的方式有哪些?
本文介绍了Android多线程编程的重要性及其实现方法,涵盖了基本概念、常见线程类型(如主线程、工作线程)以及多种多线程实现方式(如`Thread`、`HandlerThread`、`Executors`、Kotlin协程等)。通过合理的多线程管理,可大幅提升应用性能和用户体验。
119 15
一个Android App最少有几个线程?实现多线程的方式有哪些?
|
2月前
|
存储 开发工具 Android开发
使用.NET MAUI开发第一个安卓APP
【9月更文挑战第24天】使用.NET MAUI开发首个安卓APP需完成以下步骤:首先,安装Visual Studio 2022并勾选“.NET Multi-platform App UI development”工作负载;接着,安装Android SDK。然后,创建新项目时选择“.NET Multi-platform App (MAUI)”模板,并仅针对Android平台进行配置。了解项目结构,包括`.csproj`配置文件、`Properties`配置文件夹、平台特定代码及共享代码等。
147 2
|
2月前
|
XML Android开发 数据格式
🌐Android国际化与本地化全攻略!让你的App走遍全球无障碍!🌍
在全球化背景下,实现Android应用的国际化与本地化至关重要。本文以一款旅游指南App为例,详细介绍如何通过资源文件拆分与命名、适配布局与方向、处理日期时间及货币格式、考虑文化习俗等步骤,完成多语言支持和本地化调整。通过邀请用户测试并收集反馈,确保应用能无缝融入不同市场,提升用户体验与满意度。
100 3
|
2月前
|
Java 数据库 Android开发
一个Android App最少有几个线程?实现多线程的方式有哪些?
本文介绍了Android应用开发中的多线程编程,涵盖基本概念、常见实现方式及最佳实践。主要内容包括主线程与工作线程的作用、多线程的多种实现方法(如 `Thread`、`HandlerThread`、`Executors` 和 Kotlin 协程),以及如何避免内存泄漏和合理使用线程池。通过有效的多线程管理,可以显著提升应用性能和用户体验。
69 10
|
1月前
|
安全 网络安全 Android开发
深度解析:利用Universal Links与Android App Links实现无缝网页至应用跳转的安全考量
【10月更文挑战第2天】在移动互联网时代,用户经常需要从网页无缝跳转到移动应用中。这种跳转不仅需要提供流畅的用户体验,还要确保安全性。本文将深入探讨如何利用Universal Links(仅限于iOS)和Android App Links技术实现这一目标,并分析其安全性。
206 0
|
2月前
|
XML 数据库 Android开发
10分钟手把手教你用Android手撸一个简易的个人记账App
该文章提供了使用Android Studio从零开始创建一个简单的个人记账应用的详细步骤,包括项目搭建、界面设计、数据库处理及各功能模块的实现方法。
|
3月前
|
API Android开发
Android P 性能优化:创建APP进程白名单,杀死白名单之外的进程
本文介绍了在Android P系统中通过创建应用进程白名单并杀死白名单之外的进程来优化性能的方法,包括设置权限、获取运行中的APP列表、配置白名单以及在应用启动时杀死非白名单进程的代码实现。
62 1
|
3月前
|
IDE Java 开发工具
探索安卓开发之旅:打造你的第一款App
【8月更文挑战第24天】在这篇文章中,我们将一起踏上激动人心的安卓开发之旅。不论你是编程新手还是希望扩展技能的老手,本文将为你提供一份详尽指南,帮助你理解安卓开发的基础知识并实现你的第一个应用程序。从搭建开发环境到编写“Hello World”,每一步都将用浅显易懂的语言进行解释。那么,让我们开始吧!
|
3月前
|
开发工具 Android开发