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数据。


五、源码


GitHub:GoodNews

CSDN:GoodNews_2.rar



相关文章
|
3月前
|
XML Java 数据库
安卓项目:app注册/登录界面设计
本文介绍了如何设计一个Android应用的注册/登录界面,包括布局文件的创建、登录和注册逻辑的实现,以及运行效果的展示。
277 0
安卓项目:app注册/登录界面设计
|
4天前
|
Dart 前端开发 Android开发
【02】写一个注册页面以及配置打包选项打包安卓apk测试—开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草央千澈
【02】写一个注册页面以及配置打包选项打包安卓apk测试—开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草央千澈
【02】写一个注册页面以及配置打包选项打包安卓apk测试—开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草央千澈
|
21天前
|
存储 监控 API
app开发之安卓Android+苹果ios打包所有权限对应解释列表【长期更新】-以及默认打包自动添加权限列表和简化后的基本打包权限列表以uniapp为例-优雅草央千澈
app开发之安卓Android+苹果ios打包所有权限对应解释列表【长期更新】-以及默认打包自动添加权限列表和简化后的基本打包权限列表以uniapp为例-优雅草央千澈
|
4月前
|
Java 数据库 Android开发
一个Android App最少有几个线程?实现多线程的方式有哪些?
本文介绍了Android多线程编程的重要性及其实现方法,涵盖了基本概念、常见线程类型(如主线程、工作线程)以及多种多线程实现方式(如`Thread`、`HandlerThread`、`Executors`、Kotlin协程等)。通过合理的多线程管理,可大幅提升应用性能和用户体验。
165 15
一个Android App最少有几个线程?实现多线程的方式有哪些?
|
4月前
|
存储 开发工具 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`配置文件夹、平台特定代码及共享代码等。
382 2
|
4月前
|
XML Android开发 数据格式
🌐Android国际化与本地化全攻略!让你的App走遍全球无障碍!🌍
在全球化背景下,实现Android应用的国际化与本地化至关重要。本文以一款旅游指南App为例,详细介绍如何通过资源文件拆分与命名、适配布局与方向、处理日期时间及货币格式、考虑文化习俗等步骤,完成多语言支持和本地化调整。通过邀请用户测试并收集反馈,确保应用能无缝融入不同市场,提升用户体验与满意度。
158 3
|
4月前
|
Java 数据库 Android开发
一个Android App最少有几个线程?实现多线程的方式有哪些?
本文介绍了Android应用开发中的多线程编程,涵盖基本概念、常见实现方式及最佳实践。主要内容包括主线程与工作线程的作用、多线程的多种实现方法(如 `Thread`、`HandlerThread`、`Executors` 和 Kotlin 协程),以及如何避免内存泄漏和合理使用线程池。通过有效的多线程管理,可以显著提升应用性能和用户体验。
132 10
|
3月前
|
安全 网络安全 Android开发
深度解析:利用Universal Links与Android App Links实现无缝网页至应用跳转的安全考量
【10月更文挑战第2天】在移动互联网时代,用户经常需要从网页无缝跳转到移动应用中。这种跳转不仅需要提供流畅的用户体验,还要确保安全性。本文将深入探讨如何利用Universal Links(仅限于iOS)和Android App Links技术实现这一目标,并分析其安全性。
491 0
|
4月前
|
移动开发 定位技术 Android开发
「揭秘高效App的秘密武器」:Kotlin Flow携手ViewModel,打造极致响应式UI体验,你不可不知的技术革新!
【9月更文挑战第12天】随着移动开发领域对响应式编程的需求增加,管理应用程序状态变得至关重要。Jetpack Compose 和 Kotlin Flow 的组合提供了一种优雅的方式处理 UI 状态变化,简化了状态管理。本文探讨如何利用 Kotlin Flow 增强 ViewModel 功能,构建简洁强大的响应式 UI。
73 3
|
4月前
|
安全 Java Android开发
探索安卓应用开发的新趋势:Kotlin和Jetpack Compose
在安卓应用开发领域,随着技术的不断进步,新的编程语言和框架层出不穷。Kotlin作为一种现代的编程语言,因其简洁性和高效性正逐渐取代Java成为安卓开发的首选语言。同时,Jetpack Compose作为一个新的UI工具包,提供了一种声明式的UI设计方法,使得界面编写更加直观和灵活。本文将深入探讨Kotlin和Jetpack Compose的特点、优势以及如何结合使用它们来构建现代化的安卓应用。
110 4

热门文章

最新文章