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

iOS 开发中的 ViewModel

有几种方案: UI 布局尽量用 IB 来做,把绑定逻辑放到 View 中 把绑定逻辑放到 Model 中 定义单独的 ViewModel 加工 Model,并把适合展示的数据输出给 View 以上这几种方案主要说的是数据绑定...如果ProfileHeader中有很多其它的辅助方法,在NewHeader中也要用到,那NewHeader就得继承ProfileHeader,然后重写bind方法……所以这种方案啊,是不太科学的……想必你也发现了...方法中,一旦有业务场景需要不同的数据加工逻辑,就要新建一个 Model 或者继承Profile。...然后我们把它注入到 View 中即可,注入的方式无所谓,无论是作为初始化参数,抑或是作为属性或者方法参数等等,都可以,只要它是能被外部注入的,而不是由 View 自己生成的即可。...,在我这个简单的例子中表现并不比方案三中普通的 ViewModel 更好。

1.3K81

Jetpack Compose中MVVM的实现及ViewModel和remember对比

这意味着 ViewModel 中的数据会在相关联的 ViewModelStoreOwner 存在时保持状态,直到它们的生命周期结束。...数据持久性: ViewModel: ViewModel 中的数据通常具有较长的生命周期,并且在配置更改(如屏幕旋转)时会被保留。...remember/rememberSaveable 在Compose中,remember和rememberSaveable都是用于保存可组合函数的状态的方法,但它们在如何保存状态以及在什么情况下会重新计算状态上有所不同...()) 这样自定义组件时使用数据的时候复用的时候就不方便,能不能让我们的ViewModel的实例在一个类中是同一个实例呢?...:MyViewModel = viewModel() Log.i("ZLog","对象的Code:"+mainViewModel.hashCode()) 注意 : viewModel()方法会根据类型和所在的

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

    在 ViewModel 中让数据验证出错(Validation.HasError)的控件获得焦点

    需求 在 MVVM 中 ViewModel 和 View 之间的交互通常都是靠 Icommand 和 INotifyPropertyChanged,不过有时候还会需要从 MVVM 中控制 View 中的某个元素...上面的 gif 是我在另一篇文章 《自定义一个“传统”的 Validation.ErrorTemplate》 中的一个示例,在这个示例中我修改了 Validation.ErrorTemplate,这样在数据验证出错后...的 IsEnabled 与 ViewModel 上的属性绑定。...使用属性控制焦点 了解 FocusManager.FocusedElement 的使用方式以后,我们可以在 ViewModel 中定义一个 bool 类型属性 IsNameHasFocus,当调用 Submit...另一种做法是让 Validation.HasError 为 true 的控件自动获得焦点,可以在 View 上添加这个样式: <Style TargetType="TextBox" BasedOn="{

    1.5K40

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

    ( 导入依赖 | 定义 Entity 实体类 | 定义 Dao 数据库访问对象接口 | 定义数据库实例类 ) 中 , 实现了 使用 Room 框架访问 Android 中的 SQLite 数据库的操作...数据访问接口对象 中的 查询方法 , 其返回值类型改为 LiveData 类型 , LiveData 的泛型为 原来的查询方法的返回值类型 ; Dao 查询方法的返回值由 List...使用 @Database 注解修饰该类 , 其中定义 获取 Dao 数据库访问对象的抽象方法 , 以及 将该抽象类设置成 单例类 , 在单例对象初始化时创建数据库 ; 在 Room 框架中的 Dao...ViewModel 使用要点 在 Activity 组件中 , 通过调用 ViewModel 视图模型获取 数据库中的数据 , ViewModel 调用 Repository 层的增删改查方法 , Repository...在 Room 框架中的 Dao 数据库访问对象接口 的定义方式需要作出改变 , 涉及到数据库查询的 接口方法时 , 其返回值需要 返回 LiveData 类型 , 泛型设置为 List<Student

    1K20

    【翻译】WPF 中附加行为的介绍 Introduction to Attached Behaviors in WPF

    ViewModel 对象不知道 TreeViewItem 的存在,也不能约束他们,所以期望 ViewModel 对象把 TreeViewItem 带到视野中是没有意义的。...我们也不想把代码放在每个放置了受 ViewModel 约束的 TreeView 的后置代码中,因为这将重新引入一些我们起初通过使用 ViewModel 避免了的问题。...,你在一个元素上设置一个附加属性,那么你就可以从暴露这个附加属性的类中获得该元素的访问。...一旦那个类有权限访问那个元素,它就能在其上挂钩事件,响应这些事件的触发,使该元素做出它通常不会做的事情。创建和使用子类是个非常方便的选择,并且对 XAML 是非常友好的。...无论你怎么想,在对象上挂钩事件并且在触发时做些事情当然不是一个突破性的创新。从这个层面来说,附加行为只是做相同旧事的另一种方式。然而,这个技术的重要之处就是它有个名称,这可能是任何设计模式的重要层面。

    1.6K10

    ArcGIS JS API 4.17更改测量控件黄白相间的默认样式

    ArcGIS的底图,其实除了这种做法之外还有另一种做法,就是找到ArcGIS JS API的源码文件,直接改里面的css样式代码就可以,最后在”AriaGIS“大佬的帮助下发现确实是行得通的,但是考虑到目前项目中使用的...最后找了好久没找到最优的方法,就先自己写了一个方法,但是最近在逛ArcGIS知乎的时候发现我当初的帖子有大佬回复了,并且还附加demo,所以我就拿来试试,结果测试发现是可行的。...知乎帖子链接如下: http://zhihu.geoscene.cn/question/38481 解决方法 解决方法的话其实很简单,就是监听测量控件的激活事件,然后修改它的绘制句柄里面自带的样式属性即可...下面分别介绍在二维和三维下的修改方法,demo代码就是对大佬的代码做了一下简单修改过后的。...(关键代码) 三维下如果按照二维的方式修改的话会报错,具体原因是三维下绘制句柄中并没有palette属性导致的,所以三维下测量控件的样式更改暂未找到方法,最后跟用户沟通,取消了三维中的测量功能,但是回到公司后验证发现

    1.9K30

    《Android编程权威指南》之UI状态的保存与恢复篇

    它来自lifecycle-extensions的Android Jetpack库,目前 lifecycle-extensions 中的 API 已弃用。...destroyed") } } 访问ViewModel 书中访问ViewModel的方法已经被弃用了,正如前面所说,我的实践并非引入 lifecycle-extensions,因此实际代码有所小改动...在MainActivity.class 的 onCeate()方法中加入: override fun onCreate(savedInstanceState: Bundle?)...在设备配置改变之后,MainActivity再次访问QuizViewModel对象时,它返回的是之前创建的QuizViewModel。...,这也解决不了决进程销毁问题,在开发过程中,还会遇到其他的跟生命周期有关的问题,我们得查到根本,然后多学一些知识技术点,来解决开发问题!

    63010

    架构组件之 ViewModel | 中文教学视频

    与此同时,也让您在开发过程中更好地遵循单一职责的设计原则。此外,ViewModel 的另一大特点是它不会因为配置变更而销毁。...架构组件之 ViewModel | 中文教学视频 在视频的代码示例中,我们使用了 Kotlin 来创建 ViewModel, 创建 ViewModel 方法如下: 在 build.gradle 文件里加入生命周期管理库...(Lifecycle); 继承 ViewModel 类; 使用 ViewModelProviders 来关联 ViewModel 和相对应的UI组件 接着把曾经保存在 UI 界面中的数据剥离出来...注意事项:不要在 ViewModel 中引用 View,使用 LiveData 来通知界面更新;不要混淆 ViewModel 和 onSaveInstanceState 方法的用途。...另,生命周期管理库 LiveData 和 Room 视频即将上线,敬请期待 更多详细内容介绍,请访问以下文档链接 架构组件的官方开发者文档 ViewModel 的文档 应用程序架构指南 使用生命周期管理库的架构组件实例

    1.5K30

    【AAC 系列四】深入理解架构组件:ViewModel

    并且 ViewModel 能够让我们不必去担心潜在的内存泄露问题,同时 ViewModel 相比于用onSaveInstanceState() 方法更有优势,比如存储相对大的数据,并且不需要序列化以及反序列化...看下来发现我们 ViewModel 的 class 是传给了 ViewModelProvider.get() 方法。...再仔细思考一下,get 方法会优先从这个 ViewModelStore 中去拿,那么理论上只要保证 ViewModelStore 这个类在配置变化的过程中没有被销毁,那么就可以保证我们创建的 ViewModel...里的某个 View,让 ViewModel 持有 Activity 会导致内存泄露,还要注意的是连 Lifecycle 也不行; 不能访问 UI :ViewModel 应该只负责管理数据,不能去访问...总结 ViewModel 利用 Fragment 的特性,提供给我们一个方式在特定的生命周期内去管理跟 UI 相关的数据;能够帮助我们把数据管理的逻辑从 Activity/Fragment 中剥离开。

    94940

    在 Android 和 Hilt 中限定作用域

    应用中任何依赖于 UserManager 的类型都将获得相同的实例。 注意 : 默认情况下,Hilt 中的绑定都 未限定作用域 。这些绑定不属于任何组件,并且可以在整个项目中被访问。...如果另一个类出于某种原因需要访问这个被限定了作用域的变量,每次访问也会获得相同实例。...因为 Activity 具有 ViewModel 的访问权限,所以在该 Activity 中可以始终获得相同的 AnalyticsAdapter 实例。...对比 Hilt 及 ViewModel 限定作用域 使用 Hilt 限定作用域,优势为您可在 Hilt 组件层次结构中使用被限定的类型;而对于 ViewModel,则必须通过 ViewModel 手动访问被限定作用域的类型...例如: 将作用域限定为 BackStackEntry 的 ViewModel。 限定作用域会有一些代价,因为提供的对象在持有者被销毁之前将一直保留在内存中。请在应用中慎重地考虑使用限定作用域的对象。

    1.4K20

    优化 Flutter 应用开发:探索 ViewModel 的威力

    介绍1.1 什么是 ViewModel?ViewModel,顾名思义,就是视图的模型。在 Flutter 中,ViewModel 是一种用于管理视图状态和业务逻辑的重要概念。...在视图中使用 Consumer 或 Provider.of 获取 ViewModel:在需要访问 ViewModel 的地方使用 Consumer 或 Provider.of 获取 ViewModel...在视图中引入 ViewModel:在需要访问 ViewModel 的地方引入 ViewModel 类,并根据需要更新视图。...网络请求和数据持久化:ViewModel 可以包含网络请求和数据持久化的逻辑,但应该将其封装成可复用的方法,便于在多个视图中共享和重用。...事件处理和用户交互:ViewModel 可以处理用户交互和事件响应,例如点击事件、输入事件等,但应该将其封装成可复用的方法,便于在多个视图中共享和重用。

    33910

    【译】LiveData三连

    #2 — Using a listener interface 解决这个基于数据变化更新UI的任务的另一种方法是,使用监听器接口,它给UI监听器施加了一个特定的功能。...#3 — Using an event bus 另一种方法是,当我们必须根据数据变化更新用户界面时,使用基于事件的机制(发布者/订阅者)(使用greenrobot EventBus演示)。...在基于数据变化而更新UI的情况下,比如在我们的例子中,我不认为有理由使用事件总线,但在这种方法和之前的监听器接口的方法中,我会选择后者。...❌ Bad: Start in ViewModel constructor 我们可以通过在ViewModel的构造函数中触发加载,轻松确保数据只被加载一次。这种方法在文档中也有显示。...整个公共API是一个方法 contacts() ➕ViewModel在构造函数中接受参数,不可改变,可测试性强。 这需要额外的代码来钩住ViewModelFactory,以便我们可以传递动态参数。

    1.7K20

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

    一个很方便的设计 Android 应用中的展示层的方法是让视图层(Activity 或 Fragment)去观察 ViewModel 的变化。...✅ 添加数据仓库作为数据访问的单一入口。 关于数据状态 考虑一下这种情况:你正在观察一个 ViewModel 暴露出来的 LiveData,它包含了一个待显示数据的列表。...实现这种机制有很多方法: 通过 ViewModel.onCleared() 可以通知数据仓库丢掉对 ViewModel 的回凋。...当 ViewModel 被移除或者视图的生命周期结束,订阅被清除: ? 如果尝试这种方法,有个问题:如果无法访问 LifecycleOwner ,如何从 ViewModel 中订阅数据仓库呢?...一些通用的模式是这样的: 为 ViewModel 添加 start() 方法,并尽早调用这个方法。

    3.1K30

    MVVM、RxJava、Retrofit三剑合璧,事半功倍

    而在MVVM中,数据和业务逻辑处于一个独立的ViewModel中,ViewModel只要关注数据和业务逻辑,不需要和ui控件打交道。...Data标签是数据绑定的节点,用于指定该布局文件中需要用到的数据(ViewModel),Type是ViewModel类的全路径,Name是给ViewModel取的变量名,后面布局中就是用这个name访问...在这里例子中,我们页面中展示的是用户信息,对应的ViewModel就是UserInfoViewModel,我们给它取个别名叫UserInfoViewModel,下面在访问用户名等就用UserInfoViewModel.name...因为我们有可能在ViewModel中需要调用Activity的方法,比如跳转页面,所以需要有一个入口获取Activity实例。 再看成员变量。...我们惊讶地发现FriendListBinding居然可以直接访问RecyclerView对象。其实和前面的setViewModel方法一样,这也是根据xml中控件名自动编译生成的。

    2.6K40
    领券