首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

【Jetpack】ViewModel + LiveData + DataBinding 综合使用 ( 核心要点说明 | 组合方式 | 代码示例 )

DataBinding 结合使用时 , 在 DataBinding 布局中设置的就是该 视图模型 类对象 ; 该 ViewModel 类中 , 还 使用了 LiveData , 可以实时监听数据改变...向布局中设置数据模型对象 activityMainBinding.viewmodel = viewModel 2、LiveData 使用要点 LiveData 是基于 ViewModel...ViewModel 中的数据发生了变化 , 如何将变化应用到视图组件中 , 在视图中显示最新的数据内容 , 此时就用到了 LiveData 组件 ; 在 ViewModel 的基础上 , 通过 引入 LiveData..., 可以将 运行过程中 ViewModel 中的 Model 模型数据改变 通知 视图 View , 令视图组件显示最新的数据内容 ; 在 ViewModel 中使用了 LiveData 后 , 必须调用...LiveData#observe 函数 为 LiveData 设置 androidx.lifecycle.Observer 监听器 , 如果 监听到了 LiveData 数据变化 , 直接 回调 监听器的

1.6K20
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    LiveData beyond the ViewModel

    反应式编程是一种关注数据「如何流动」以及「如何传播」的范式,它可以简化构建应用程序的代码,方便显示来自异步操作的数据。 实现一些反应式概念的一个工具是LiveData。...Patterns One-to-one static transformation — map img 在我们上面的例子中,ViewModel只是将数据从资源库转发到视图,将其转换为UI模型。...One-to-many dependency — MediatorLiveData MediatorLiveData允许你将一个或多个数据源添加到一个LiveData观察器中。...在ViewModel中,我们需要公开一个randomNumber属性,从生成器中获取数字。为此使用MediatorLiveData并不理想,因为它要求你在每次需要新数字时都要添加源。...变换在调用时创建一个新的LiveData(包括map和switchMap)。在这个例子中,随机数(randomNumber)被暴露在视图中,但每次用户点击按钮时它都会被重新分配。

    1.5K30

    深入详解 Jetpack Compose | 优化 UI 构建

    此外,我还会分享 Compose 的思维模型,您应如何考虑在 Compose 中编写代码,以及如何创建您自己的 API。...让我们在当前 Android 开发的上下文中进行更为实际的操作,并以视图模型 (view model) 和 XML 布局为例: 视图模型会向布局提供数据。...我们接收新的数量并且必须搞清楚如何更新当前的 UI 来反映对应的状态。...在 Jetpack Compose 的世界中,由于我们使用函数替代了类型,因此实现组合的方法颇为不同,但相比于继承也拥有许多优点,让我们来看一个例子: 假设我们有一个视图,并且我们想要添加一个输入。...它接收了 LiveData 作为参数并调用了 Compose 的 observeAsState 方法。

    1.4K20

    ViewModels and LiveData- Patterns + AntiPatterns

    ✅将Activity和Fragment中的逻辑保持在最低限度 View references in ViewModels 视图模型与Activity或Fragment有不同的作用域。...它将与你的应用程序的其他部分通信,并更新ViewModel中的LiveData持有者。 添加一个Domain layer并采用Clean Architecture。...建议有一个单独的存储库类作为处理这种复杂性的单一入口。 如果你有多个非常不同的数据模型,可以考虑添加多个存储库。...视图如何区分正在加载的数据、网络错误和一个空列表? 你可以从ViewModel中暴露出一个LiveData。例如,MyDataState可以包含关于数据是否正在加载、是否已经成功加载或失败的信息。...参见我们样本中的资源类:https://developer.android.com/jetpack/guide#addendum。 ✅使用包装器或另一个LiveData暴露你的数据的状态信息。

    1.1K30

    ViewModel 和 LiveData:为设计模式打 Call 还是唱反调?

    用 Architecture Components 构建的 APP 中实体的典型交互 理想情况下,ViewModel 不应该知道任何关于 Android 的事情(如Activity、Fragment)...让 Presenter 来跟应用的其他部分进行沟通并更新 ViewModel 中持有的 LiveData。 添加一个 Domain 层,使用 Clean Architecture 架构。...视图层该如何区分被加载的数据,网络错误和空列表呢? 你可以从 ViewModel 中暴露出一个 LiveData 。...但是,如果用户旋转手机,则新的 Activity 被创建并开始观察这个字段。当对 LiveData 的观察开始时,Activity 会立即收到已经使用过的值,这将导致消息再次显示!...当 ViewModel 被移除或者视图的生命周期结束,订阅被清除: ? 如果尝试这种方法,有个问题:如果无法访问 LifecycleOwner ,如何从 ViewModel 中订阅数据仓库呢?

    3.1K30

    “终于懂了“系列:Jetpack AAC完整解析(四)MVVM - Android架构探索!

    点击上方胡飞洋可以关注哦~ 前面三篇介绍了Jetpack 架构组件中 最重要 的部分:生命周期组件-Lifecycle、感知生命周期的数据组件-LiveData、视图模型组件-ViewModel。...View,视图,即Activity/Fragment ViewModel,视图模型,负责业务逻辑。 注意,MVVM这里的ViewModel就是一个名称,可以理解为MVP中的Presenter。...3.2.1 构建界面 首先创建一个列表页面 UserListActivity,并且知道页面所需要的数据是,用户信息列表。 那么 用户信息列表 如何获取呢?...应用中的其他组件可以使用此存储器监控对象的更改,而无需在它们之间创建明确且严格的依赖路径。...这就浪费了宝贵的网络资源,迫使用户等待新的查询完成。所以,我们向 UserRepository 添加了一个新的数据源,本地缓存。

    2.1K20

    【Jetpack】Room + ViewModel + LiveData 综合使用 ( 核心要点说明 | 组合方式 | 代码示例 )

    , 每当数据库中的数据发生变化时 , 就需要开启线程 , 重新获取数据库中的数据 ; 为了优化上述问题 , 可以引入 LiveData 和 ViewModel , ViewModel 是 视图 View...LiveData 设置的 androidx.lifecycle.Observer 监听器回调中 更新 View 视图 ; View 视图层 : Activity / Fragment 负责视图显示的...ViewModel 使用要点 在 Activity 组件中 , 通过调用 ViewModel 视图模型获取 数据库中的数据 , ViewModel 调用 Repository 层的增删改查方法 , Repository...调用 Room 框架的相关方法操作 SQLite 数据库 ; 首先 , 获取 ViewModel 视图模型 ; // 获取 ViewModel 视图模型对象 var viewModel...通过调用 ViewModel 视图模型 , 访问 Room 数据库框架 , 对数据进行增删改查 , 并通过 LiveData 监听数据库中的数据 , 如果数据库中的数据发生改变 , 自动回调 LiveData

    1K20

    在 SnackBar,Navigation 和其他事件中使用 LiveData(SingleLiveEvent 案例)

    例如:当没有观察者处于监听状态时,可以设置一个值,因此新的值将会替换它。此外,从不同线程设置值的时候可能会导致资源竞争,只会向观察者发出一次改变信号。 但是这种方法的主要问题是难以理解和不简洁。...使用 LiveData 进行事件处理,在观察者中重置事件的初始值 通过这种方法,您可以添加一种方法来从视图中支出您已经处理了该事件,并且重置该事件。...myViewModel.navigateToDetailsHandled() startActivity(DetailsActivity...) } }) 像下面这样在 ViewModel 中添加新的方法...如果您无意中添加了多个,则只会调用一个,并且不能保证哪一个。 ? ✔️ 推荐: 使用事件包装器 在这种方法中,您可以明确地管理事件是否已经被处理,从而减少错误。...这个方法将事件建模为状态的一部分:他们现在只是一个消耗或者不消耗的消息。 ? 使用事件包装器,您可以将多个观察者添加到一次性事件中。 ---- 总之:把事件设计成你的状态的一部分。

    2.8K41

    安卓开发中的Model-View-Presenter(MVP模式)

    (我们通常也将其称为无控制器的架构),它允许我们完全分离模型层的视图。...像这样,我们可以使用RxJava在我们的服务,所以我们可以操作数据与我们所有这个库提供的运营商和LiveData视图的一部分,这将使我们能够使一个实现,意识到我们的活动的生命周期的变化,甚至使用谷歌提供的视图模型...正是由于使依赖服务=>视图反转,而且不仅依赖视图=>服务,我们还可以做以下事情: 在运行时视图中添加/删除更多侦听器 时使用多个“侦听器”的相同视图。...改进 有许多事情可以改进,例如: ViewModel: 可以在视图和表示器之间添加一个额外的层,表示器负责保存视图的状态。...此外,这个视图模型可以直接将数据绑定注入到XML中,并使用LiveData将可视化组件绑定到LiveData的可观察对象。

    1.6K30

    【译】LiveData with Coroutines and Flow

    这个订阅可以用LiveData.observe设置,也可以用Data Binding库自动设置。 现在,如果设备被旋转,那么视图将被销毁(#1),并创建一个新的实例(#2)。...(it)) } } result是一个不可变的LiveData,只要itemId有新的值,就会用调用fetchItem suspend函数的结果来更新数据。...{ // Ok-ish because we call delay inside // Compute delay(1000) } } 也就是说,我建议你无论如何都要添加这个检查...从未被设计成一个功能齐全的流构建器这一事实。...在这个例子中,我们使用的API让我们设置了一个完成的监听器和一个失败的监听器,所以在它们的回调中,当我们收到数据或错误时,我们会调用continuation.resume或continuation.resumeWithException

    1.4K10

    【Jetpack】LiveData 架构组件 ( LiveData 简介 | LiveData 使用方法 | ViewModel + LiveData 示例 )

    一、LiveData 简介 ---- 在 视图 View 与 数据模型 Model 通过 ViewModel 架构组件 进行绑定后 , 可以立即 将 ViewModel 中的数据设置到 UI 界面中..., 运行过程中 , 在 UI 界面中 , 可以 修改 ViewModel 中的值 , 并 将新的值设置在 视图 View 中 ; 但是 , 如果 数据是在 ViewModel 中发生的改变 , 那么如何...视图 View ; 二、LiveData 使用方法 ---- 首先 , 在 ViewModel 视图模型 中定义 LiveData 数据 , 如 MutableLiveData , class MyViewModel...然后在 Activity 中 为 LiveData 添加 Observer 监听器 , 当 LiveData 数据发生改变时 , 会自动回调该监听器的 onChange 方法 ; 1、ViewModel...; 启动 Timer 定时器 , 修改 ViewModel 中的 LiveData 数据 , 在 LiveData 数据发生改变时 , 会自动回调 Observer 监听器的 onChanged 函数

    1.3K20

    MVVM+数据绑定,让你的Android应用飞起来,MVVM+数据绑定技巧,打造Android应用的数据流水线!

    在该模式中,视图(View)负责展示用户界面,模型(Model)管理数据和业务逻辑,而视图模型(ViewModel)则作为两者的中介,实现了数据的转换和逻辑的处理。...一、MVVM与MVC的对比 MVC(Model-View-Controller)是一种经典的软件架构模式,它将应用程序划分为三个基本部分:模型(Model)、视图(View)和控制器(Controller...在MVC中,模型负责处理数据和业务逻辑,视图负责展示数据,而控制器则负责接收用户的输入并协调模型和视图之间的交互。 MVVM模式在MVC的基础上进行了改进和优化。...MVVM MVC 关注点分离 MVVM 实现了 UI 和业务逻辑之间的清晰分离,使代码库更加模块化和可维护。 MVC 也分离了模型、视图和控制器之间的职责,但控制器通常还需要处理部分UI逻辑。...控制器和模型的测试相对容易,但视图的测试通常较为困难。 数据绑定 MVVM 利用数据绑定,允许在 View 和 ViewModel 之间自动同步数据,从而减少样板代码。

    13210

    实战 | 使用 Kotlin Flow 构建数据流 管道

    Flow 是一种基于流的编程模型,本文我们将向大家介绍响应式编程以及其在 Android 开发中的实践,您将了解到如何将生命周期、旋转及切换到后台等状态绑定到 Flow 中,并且测试它们是否能按照预期执行...某个示例应用界面的 "数据流动" 如下图所示,身份认证管理器会告诉数据库用户已登录,而数据库又必须告诉远程数据源来加载一组不同的数据;与此同时这些操作在获取新数据时都会告诉视图显示一个转圈的加载图标。...我们使用数据流构建器来创建数据流,因为 Flow 是在协程上下文环境中运行的,它以挂起代码块作为参数,这也意味着它能够调用挂起函数,我们可以在代码块中使用 while(true)来循环执行我们的逻辑。...在示例代码中,我们首先从 API 获取消息,然后使用 emit 挂起函数将结果添加到 Flow 中,这将挂起协程直到收集器接收到数据项,最后我们将协程挂起一段时间。...我们可以使用终端运算符 collect 来监听数据流发送的所有值,collect 接收一个函数作为参数,每个新值都会调用该参数,并且由于它是一个挂起函数,因此需要在协程中执行。

    1.5K10

    【译】LiveData三连

    在社区内有一个激烈的讨论,即事件总线是否是一个好的解决方案,或者说监听器回调是否是真正的解决方案。无论如何,这种技术,作为监听器接口,也避免了数据丢失,并保持代码中的职责分离。...视图模型返回LiveData,它是一个可观察的类,从而使我们的Activity成为观察者。就像基于事件的解决方案一样,当数据被改变时,我们会相应地改变用户界面。...在我们的例子中,视图模型从UserRepository类中获得其返回值,该类保留了一个LiveData的实例,该实例包裹着一个数据持有者FollowStatus。...当用户点击Follow/Unfollow按钮时,代码会调用视图模型的toggleFollowing方法,这又会调用UserRepository。...整个公共API是一个方法 contacts() 在这个例子中,我们为每个方法的调用创建了新的LiveData,为了避免这种情况,我们必须解决参数可能不同的问题。Lazy Map在这里可以提供帮助。

    1.7K20

    Kotlin上的反应式流-SharedFlow和StateFlow

    点击上方蓝字关注我,知识会给你力量 在本教程中,你将学习Kotlin中的反应式流,并使用两种类型的流——SharedFlow和StateFlow,构建一个应用程序。...在开始前,你需要知道如何创建一个SharedFlow。好吧,今天是你的幸运日,因为你将连续创建两个,在类的顶部添加这段代码。...replay:向新订阅者重放的数值的数量。它不能是负数,默认为零。 extraBufferCapacity:缓冲的值的数量。不能为负数,默认为零。...CoinsSharedViewModel中的MutableSharedFlow()正在使用默认参数。但你可以随意玩一玩,看看它是如何影响SharedFlow的!...这个简单的ViewModel使用LiveData来向CoinListFragment暴露一个视图状态类。状态类本身也相当简单,它有默认值来匹配初始视图状态。

    2.3K60

    谁能取代Android的LiveData- StateFlow or SharedFlow?

    在所有应用层上使用纯Flow作为LiveData的替代品的主要问题是: Flow是无状态的(不能通过.value访问) Flow是声明性的(冷的):一个Flow构建器仅仅描述了Flow是什么,并且只有在...在我们的实际例子中,我们将为每个采集器添加一个新的GeoQuery监听器--可能不是一个关键问题,但肯定是在浪费内存和CPU周期。...这类似于我们之前通过在onActive()回调中添加GeoQuery监听器和在onInactive()回调中删除监听器来实现的LiveData行为。...对于重放参数,我们可以使用1:新的订阅者将在订阅后立即获得最后一个发出的值。...状态流总是有一个初始值,向新的订阅者复制一个最新的值,不缓冲任何更多的值,但保留最后发出的一个值,并且不支持 resetReplayCache。

    1.6K20

    有小伙伴说看不懂 LiveData、Flow、Channel,跟我走

    冷数据流与热数据流 Kotlin Flow 包含三个实体:数据生产方 - (可选的)中介者 - 数据使用方。数据生产方负责向数据流发射(emit)数据,而数据使用方从数据流中消费数据。...: 创建数据流 flow{}: Flow 构造器会创建一个新的数据流。...flow{} 是 suspend 函数,需要在协程中执行; 发送数据 emit(): emit() 将一个新的值发送到数据流中; 终端操作 collect{}: 触发数据流消费,可以获取数据流中所有的发出值...通过 WhildSubscribed() 策略能够在没有订阅者的时候及时停止数据流,避免引起不必要的资源浪费,例如一直从数据库、传感器中读取数据。...DROP_OLDEST: 意味着每次发射的新数据会覆盖旧数据; 总的来说,StateFlow 要求传入初始值,并且仅支持保存一个最新的数据,会向新订阅者会重放一次最新值,也不允许重置重放缓存。

    2.5K10

    Now in Android #15 —— 最新 Android 知识分享

    向 AndroidX 迁移 Nick Anthony 发布了一篇关于如何从 Support 库迁移到 AndroidX 的文章,地址如下: https://medium.com/androiddevelopers...v=wAQCs8-a6mg&feature=youtu.be 对于内联函数,编译器会把函数代码直接复制到函数调用处,以此来消除当参数类型是 lambda 时带来的额外的内存消耗。...但内联函数并不是万能的,一般只用参数是 lambda 的情况下。当函数体很复杂的时候,也不适合用内联,反而会增大程序体积,得不偿失。...大家肯定都了解了如何在 ViewModel/LiveData/Lifecycle 中正确的使用协程,使得在恰当的情况下可以取消协程,比如用户离开当前页面。...在 4.0 中,支持视图的 3D 展示,视图实时更新,直接跳转到视图声明处。我也写了一篇文章进行介绍: Layout Inspector 支持 3D 视图了!

    99630

    Android SingleLiveEvent Redux with Kotlin Flow

    这使得视图模型与视图解耦,允许视图经历各种生命周期状态,而不需要向观察者发送数据。 在我的ViewModels中,我通常会公开两个流来进行观察。第一个是视图状态。这个数据流定义了用户界面的状态。...视图模型在构建时立即发射了两个事件。...观察者可能不会马上消费它们,所以它们被简单地缓冲,并在观察者开始从Flow中collect时被发射出来。在上面的例子中,还包括了视图模型对按钮点击的处理。 事件发射器的实际定义出乎意料的简单和直接。...那么,我们如何安全地观察只在给定生命周期状态下的事件流呢?如果我们观察视图模型的事件流,比如说一个Fragment,在Fragment提供的coroutine范围内,这是否能满足我们的需要?...总结一下:视图模型的事件流是用一个通道接收作为流来定义的。这允许视图模型提交事件而不必知道观察者的状态。在没有观察者的情况下,事件被缓冲了。

    1K30
    领券