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

知识点 | ViewModel 四种集成方式

下面的文章中,我将介绍 ViewModel 的四种集成方式: ViewModel 中的 Saved State —— 后台进程重启时,ViewModel 的数据恢复; 在 NavGraph 中使用 ViewModel...SavedStateHandle 和 Bundle 一样,以键值对形式存储数据,它包含在 ViewModel 中,并且可以在应用处于后台时进程被杀死的情况下幸存下来。...设置 Save State 模块 现在让我们看看如何使用 SaveState 组件。注意接下来的代码会和 Lifecycles Codelab 第六步中的一段代码十分相似。...Ian Lake 在他的演讲: 单 Activity 架构: 为什么、什么情况下以及如何使用中介绍了一些我们选择单一 Activity 架构的原因,而与本文相关的一点,是这种架构允许在多个界面 (destination...组件处理 onSaveInstanceState 相关逻辑; 通过配合 View Model 和导航图来精确限定数据在 Fragment 中的共享范围; 使用 DataBinding 库时,可以将 ViewModel

2.6K20

知识点 | ViewModel 四种集成方式

下面的文章中,我将介绍 ViewModel 的四种集成方式: ViewModel 中的 Saved State —— 后台进程重启时,ViewModel 的数据恢复; 在 NavGraph 中使用 ViewModel...SavedStateHandle 和 Bundle 一样,以键值对形式存储数据,它包含在 ViewModel 中,并且可以在应用处于后台时进程被杀死的情况下幸存下来。...设置 Save State 模块 现在让我们看看如何使用 SaveState 组件。注意接下来的代码会和 Lifecycles Codelab 第六步中的一段代码十分相似。...Ian Lake 在他的演讲: 单 Activity 架构: 为什么、什么情况下以及如何使用中介绍了一些我们选择单一 Activity 架构的原因,而与本文相关的一点,是这种架构允许在多个界面 (destination...组件处理 onSaveInstanceState 相关逻辑; 通过配合 View Model 和导航图来精确限定数据在 Fragment 中的共享范围; 使用 DataBinding 库时,可以将 ViewModel

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

    ViewModel:持久化、onSaveInstanceState()、UI 状态恢复和 Loader

    如果你允许在类似设备突然关机的情况下丢失数据,你可以在 'onStop()'回调的时候将其保存,这个方法在 activity 一进入后台的时候就会被调用。...onSaveInstanceState() 在配置更改期间和 activity 进入后台时被调用;在这两种情况下,如果你的数据被保存在 ViewModel 中,实际上并不需要重新加载或者处理他们。...ViewModel 与其他架构组件 LiveData 和 Room 一起使用可以替代 Loader。ViewModel 保证配置更改后数据不丢失。LiveData 保证 UI 与数据同步更新。...一些使用 ViewModels 、LiveData 为加载数据的方法: 在这篇文章中,Ian Lake 概述了如何使用 ViewModel 和 LiveData 来代替 AsyncTaskLoader。...在这个场景下,ViewModel 在 activity 旋转或者进入后台时仍保留数据,而单纯用 onSaveInstanceState() 并没那么容易实现。

    1K20

    ViewModel:持久化、onSaveInstanceState()、UI 状态恢复和 Loader

    如果你允许在类似设备突然关机的情况下丢失数据,你可以在 'onStop()'回调的时候将其保存,这个方法在 activity 一进入后台的时候就会被调用。...onSaveInstanceState() 在配置更改期间和 activity 进入后台时被调用;在这两种情况下,如果你的数据被保存在 ViewModel 中,实际上并不需要重新加载或者处理他们。...ViewModel 与其他架构组件 LiveData 和 Room 一起使用可以替代 Loader。ViewModel 保证配置更改后数据不丢失。LiveData 保证 UI 与数据同步更新。...一些使用 ViewModels 、LiveData 为加载数据的方法: 在这篇文章中,Ian Lake 概述了如何使用 ViewModel 和 LiveData 来代替 AsyncTaskLoader。...在这个场景下,ViewModel 在 activity 旋转或者进入后台时仍保留数据,而单纯用 onSaveInstanceState() 并没那么容易实现。

    3.8K30

    ViewModels and LiveData- Patterns + AntiPatterns

    在ViewModels和View之间进行通信的推荐方式是观察者模式,使用LiveData或来自其他库的观察变量方式。...然而,你可能需要在ViewModels也消失的其他情况下恢复状态:例如,当操作系统资源不足并杀死了你的进程时。...ViewModels暴露了数据,但事件呢?例如,导航事件或显示Snackbar信息是只应执行一次的动作。 事件的概念与LiveData存储和恢复数据的方式并不完全相符。...LiveData是这个结构的关键组件,所以通常你的Activity和Fragment会观察LiveData实例。 ViewModels如何与其他组件通信由你决定,但要注意泄漏和边缘情况。...✅考虑边缘情况、泄漏以及长期运行的操作会如何影响你架构中的实例。 ❌ 不要在ViewModel中放置对保存清洁状态或与数据有关的逻辑。你从ViewModel进行的任何调用都可能是最后一次。

    1.1K30

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

    ViewModels 暴露数据,但对于事件怎么样呢?例如,导航事件或显示 Snackbar 消息等应该仅被执行一次的操作。 事件的概念并不能和 LiveData 存取数据的方式完美匹配。...✅ 使用像 SingleLiveEvent 这样的 observable 来处理导航栏或者 SnackBar 显示消息这样的情况 ViewModels 的泄漏问题 响应式范例在 Android 中运行良好...LiveData 是这个架构的关键组件,因此通常你的 Activity 和 Fragment 会观察 LiveData 实例。...ViewModel 如何与其他组件进行通信取决于你,但要注意泄漏问题和边界情况。看下面这个图,其中 Presenter 层使用观察者模式,数据层使用回调: ?...理想情况下,ViewModels 在没有任何观察者的情况下不应该持有 ViewModel 的引用: ?

    3.1K30

    Android 架构组件的最新进展 (上篇)

    根据我们曾经做的调查,开发者们希望 Android 官方可以维护一些实用的组件库和架构实践,以降低中大型应用的开发门槛,这样开发团队就可以集中更多精力在实际业务的优化和改进上。...和管理后台任务的 WorkManager 库。...ViewModel 用于: 保留应用对网络、数据库的请求 当作大型对象的缓存 SavedState 用于: UI 的状态记录,比如选择区域和滚动距离等 导航状态键值记录 各取所长,联手打造流畅体验 //...initialization val userViewModel: UserViewModel by viewModels() 导航 导航 (Navigation) 是一套管理应用内 UI 流程的...ViewModel 来管理 使用 URI 直接导航 对话框可以做为导航目标 更好地对动态功能做出支持 请大家保持对本次连载的关注,我们会在下篇中为大家介绍分页库、Room 持久性库和 WorkManager

    91340

    Android 面试题:为什么 Activity 都重建了 ViewModel 还存在?—— Jetpack 系列(3)

    5、WorkManager:加强对后台任务的支持 6、Compose:新一代视图开发方案 ---- 1....() { // 使用 Activity 的作用域 private val viewModel : MainViewModel by viewModels() } // 在 Fragment...总结一下重建前后的实例变化,帮助你理解: Activity: 构造新的实例; ViewModelStore: 保留旧的实例; ViewModel: 保留旧的实例(因为 ViewModel 存储在 ViewModelStore...映射表中); LiveData: 保留旧的实例(因为 LiveData 是 ViewModel 的成员变量); 现在,我们逐一分析这 3 个阶段的源码执行过程: 阶段 1 源码分析: Activity.java...而前 2 种情况都属于非配置变更触发的,在 Activity 中存在 1 个 Lifecycle 监听:当 Activity 进入 DESTROYED 状态时,如果 Activity 不处于配置变更重建的阶段

    1.2K20

    在 Android 和 Hilt 中限定作用域

    当涉及到 DI (依赖项注入) 时,限定对象 A 的作用域为一个容器,则意味着该容器在销毁之前始终提供相同的 A 实例。 在 Hilt 中,您可以通过注解将类型的作用域限定在某些容器或组件内。...被限定作用域的类型在应用组件中沿 组件层次结构 向下传递: 在本案例中,相同的 UserManager 实例将被提供给层次结构内其余的 Hilt 组件。...应用中任何依赖于 UserManager 的类型都将获得相同的实例。 注意 : 默认情况下,Hilt 中的绑定都 未限定作用域 。这些绑定不属于任何组件,并且可以在整个项目中被访问。...每次被请求都会提供该类型的不同实例。当您将绑定的作用域限定为某个组件时,它会限制您使用该绑定的范围以及该类型可以具有的依赖项。...通过使用 ViewModel 或者 Hilt 中的 ActivityRetainedScope 注解,您可以在系统设置更改后获得相同的实例 如果您希望在遵循良好的 DI 实践的同时,保留 ViewModel

    1.4K20

    使用导航组件: 条件导航 | MAD Skills

    这是第二个关于导航 (Navigation) 的 MAD Skills 系列,本文是导航组件系列的第二篇文章,如果您想回顾过去发布的内容,请参考下面链接查看: 导航组件概览 导航到对话框 在应用中导航时使用...在 上一篇文章 中,我使用 NavigationUI 实现了应用的底部导航,并增加了 SelectionFragment 来启用或禁用咖啡记录功能。...我将使用 Datastore API 来保存用户的选择,并据此决定是否在底部导航中展示 coffeeList 目的地。...在应用中使用条件导航的准备工作 这是自上一篇文章以来我所做 修改 的快速回顾: 首先,我添加了 UserPreferencesRepository,它使用 DataStore API 来保存用户的选择;...在接下来的文章中,我们将学习如何使用嵌套图 (Nested graphs) 并将模块化该应用。

    1.6K30

    学习|Android中JetPack中的几个组件简单使用

    这些组件可帮助您遵循最佳做法、让您摆脱编写样板代码的工作并简化复杂任务,以便您将精力集中放在所需的代码上。 ?...说起来Google对JetPack也是非常的重视,从它的官方主页也可以看出来JetPack在首页上就有一个导航栏了。 ?...上面这个是引用fragment-ktx的引用,引用这个库时是为了让我们更简单的调用ViewModel,一会儿的代码我会写出不用这个的调用方法,和用这个的方法,当然引用这个时它会提示要使用jvm1.8,所以还需要加上下面的这步...03 lifecycle-savestate 一般来说,我们用LiveData的话,应用程序在后台切换再回来后,当前的UI界面的数据也会保存的,在新的Android版本后,一般程序到后台一段时间后,系统会直接杀死程序了...,就是把我们程序被杀死时保存的数据传入进来,通过set的方式写入,getlivedata的方法读出来。

    1.7K20

    C# WPF MVVM开发框架Caliburn.Micro 名称Transformer⑩①

    使用名称Transformer NameTransformer是在Caliburn.Micro v1.1中引入的,它是ViewLocator和ViewModelLocator如何将类名映射到其伙伴角色的一个组成部分...名称转换基于使用正则表达式模式匹配的规则。执行转换时,将按顺序计算所有已注册的规则。默认情况下,NameTransformer返回所有匹配规则生成的结果名称。...因此,在向NameTransformer添加规则时,必须首先添加更一般的规则,最后添加更具体的规则。...如果需要“交换”任何一个单独的组件,则可以使用单独的组件。 上面示例中的捕获组“后缀”对以“ViewModels”结尾的名称进行模式匹配。...使用此捕获组的主要原因是防止子字符串“ViewModels”在“basename”组中被捕获,在大多数情况下,这是字符串转换的一部分。

    1.8K20

    .NET MAUI实战 Dispatcher

    详细内容 这一期分享的内容非常简单,在之前使用过WPF的开发者对MVVM开发模式下ViewModel中后台线程转UI线程并不陌生使用Appplication.Current.Dispatcher。...那么在.NET MAUI中也有同样的机制,存在于.NET MAUI Shell对象中。 那么什么是Shell?...官网描述如下,.NET 多平台应用 UI (.NET MAUI) Shell 通过提供大多数应用所需的基本功能(包括: 用于描述应用的视觉层次结构的单个位置。 常见的导航用户体验。...基于 URI 的导航方案,允许导航到应用中的任何页面。 集成的搜索处理程序。 其他内容就不搬运了,大伙可以参考下面链接内容。...ref:https://docs.microsoft.com/zh-cn/dotnet/maui/fundamentals/shell/ 接下来我们直接来看看实际运用是如何的,代码如下: using System

    47110

    Android面试题之Kotlin Jetpack的三大核心组件

    ViewModel 和 LiveData 是 Android Jetpack 组件库中的两个核心组件,它们能帮助开发者更有效地管理 UI 相关的数据,并且能够在配置变更(如屏幕旋转)时保存和恢复 UI...用于ViewModel数据返回时通知View更新,是ViewModel和View之间的桥梁 那么如何在 Kotlin 中正确优雅地使用 ViewModel 和 LiveData 呢。...在 Activity 或 Fragment 中使用 ViewModel 通过 ViewModelProvider 获得 ViewModel 实例,并观察 LiveData。...在 Fragment 中使用 ViewModel 如果在 Fragment 中使用 ViewModel,可以使用 viewModels 或 activityViewModels: import android.os.Bundle...、 LiveData,可以实现数据的生命周期感知,并且在配置变更(如设备旋转)时也能保持 UI 的状态。

    19710

    Kotlin Flow响应式编程,StateFlow和SharedFlow

    要知道,我们使用flow构建函数构建出的Flow是属于冷流,也就是在没有任何接受端的情况下,Flow是不会工作的。...但是上述例子当中,即使程序切到了后台,Flow依然没有中止,还是为它保留了过期数据,这就是一种内存上的浪费。 当然,我们这个例子非常简单,在实际项目中一个Flow可能又是由多个上游Flow合并而成的。...当我们将程序重新切回前台时,计时器会从零开始重新计时。 这说明什么?说明Flow在程序进入后台之后就完全停止了,不会保留任何数据。程序回到前台之后Flow又从头开始工作,所以才会从零开始计时。...另外就是使用前面学习过的写法,对clickCountFlow进行collect。 现在运行一下程序,效果如下图所示: 这里需要关注的重点是,当手机发生横竖屏切换时,计数器的数字仍然会保留在屏幕上。...现在我们明白了在某些场景下粘性特性是不太适用的,接下来我们就学习一下如何使用SharedFlow这个非粘性的版本来解决这个问题。

    58210

    美团技术报告:83%的Android开发者因这5个源码盲区错失年薪50万(附50k+面试答案)

    "面了三年字节,倒在了ViewModel的HolderFragment上……" 这是上周一位读者在后台的留言。...薪资对照表: 薪资段位 能力边界 典型问题 20k以下 会用Jetpack组件 "LiveData和RxJava区别?" 30k+ 设计组件整合架构 "如何避免粘性事件?"...避坑指南: // 正确获取ViewModel实例(避免内存泄漏) val viewModel: MyViewModel by viewModels( factoryProducer = {...Navigation的"时空折叠"导航图(华为系统调度题) 致命问题:Fragment转场动画导致页面重叠(发生概率29%) 核心原理: 导航栈管理:NavController通过BackStackEntry...+):能改造Jetpack底层(如重写ViewModel存储逻辑) "只会用LiveData.observe()的开发者,就像拿着光剑却只会当棍子用的绝地武士" —— 阿里P9技术官 结语: 在2025

    8510

    C# 一个基于.NET Core3.1的开源项目帮你彻底搞懂WPF框架Prism

    --概述 这个项目演示了如何在WPF中使用各种Prism功能的示例。如果您刚刚开始使用Prism,建议您从第一个示例开始,按顺序从列表中开始。每个示例都基于前一个示例的概念。... CompositeCommands 了解如何使用CompositeCommands作为单个命令调用多个命令 IActiveAware Commands 使您的命令IActiveAware仅调用激活的命令...Event Aggregator 使用IEventAggregator Event Aggregator - Filter Events 订阅事件时筛选事件 RegionContext 使用RegionContext...了解视图和视图模型导航参与 Navigate to existing Views 导航期间控制视图实例 Passing Parameters 将参数从视图/视图模型传递到另一个视图/视图模型 Confirm...自动从内存中删除视图 Navigation Journal 了解如何使用导航日志 部分项目演示和介绍 ① BootstrapperShell启动界面: 这个主要演示Prism框架搭建的用法: step1

    1.7K20

    使用 Architecture Component 实现 MVVM 的正确姿势

    思考一下如果用常规的做法如何实现:加 Callback?还是使用 EventBus?...实例时,传递进去的 LifecycleOwner 的生命周期有关 // this 就是 LifecycleOwner,可以是 Activity 或者 Fragment val viewModel =...实例化传参 有时候我们希望给创建的 ViewModel 传递参数,这里分场景看一下: 在 Fragment 或者 Activity 中使用 ViewModel 注意事项 通过 ViewModelProvider...: MyViewModel by viewModels() 复制代码 LiveData LiveData 也是官方提供的,用于提供可被监听的数据,且具有生命周期感知能力的组件。...,如果要使用 LiveData 来实现非粘性消息(observe() 的时候不接收之前赋给 LiveData 的值),有各种 workaround 的方式,具体可以移步至我的另一篇文章:LiveData

    78820

    Android Sunflower 带您玩转 Jetpack

    为了帮助开发者把 Jetpack 组件集成到自己的应用中,我们开发出一款名为 Sunflower(太阳花) 的圆艺应用,让您能够在模拟养花的过程中学习最佳 Android 开发实践,了解别的开发者是如何利用...该系列的其它文章会陆续与各位开发者见面,如果您对 Jetpack 和 Android 开发感兴趣,或者想要进一步探索 Jetpack 导航组件,了解如何利用 WorkManager 调度循环任务,请持续关注...使用 Jetpack 组件 Sunflower 使用了 Jetpack 中的许多组件,以下为各个组件在应用中所扮演的角色: Sunflower 完全采用 Kotlin 语言,并且使用了 Android...AppCompat 保证了应用的核心功能可以在旧版本的 Android 系统上顺利运行。 WorkManager 负责管理后台任务。...在今后的文章中,我们会进一步探讨 Sunflower 中的其它 Jetpack 组件,如导航和重复任务,尽情期待。谢谢您对 Sunflower 的关注! ?

    1.5K10
    领券