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

关于Android架构,你是否还在生搬硬套?

3.2 Android视图开发可以借鉴函数式编程思想 1. 模块化意义何在?...举个例子如下图: [image] 相信很多人见过或者正在使用这种分包方式,在业务层把所有的Adapter、Presenter、Activity等等都放在对应,这种方式合理吗?...绊脚石: 通常来讲,我们通过网络请求拿到数据结构都是后端定义,这也就意味着视图层不得不直接使用后端定义字段,一旦后端进行业务调整会迫使我们前端从数据层-->视图层都会进行对应改动,如下伪代码所示:...引入diff之前: RecyclerView想要实现动态删除添加、更新需要分别手动更新数据和UI,这样在中间插了一道并且分别更新数据和UI已经违背了前面所说数据驱动UI,而我们想要是不管删除添加或者更新只有一个入口...,将请求作为入口,渲染做为出口,在这个流程尽量不做与当前行为无关事(这也要求ViewModel,Repository函数要符合单一原则)。

83610

掌握 Jetpack Compose State,看这篇就够了

创建状态实例代码如下:var enabled by remember { mutableStateOf(true) }可组合项函数,一般用这行神秘代码来构造状态实例。...最理想情况下,整个 UI 界面的状态应该在一个统一地方计算(通常是在ViewModel),计算完状态将从上到下传递到所有可组合项里。...在ViewModel持有状态把状态放在ViewModel中和把它放在可组合项函数类似。...在可组合函数,我们可以用viewModel {}函数,这个函数负责在 Compose 进行重组过程中保证每次返回都是同一个同一个ViewModel实例。...使可组合项保持无状态方法:状态提升顾名思义,状态提升意味着把任何和状态存储相关状态从可组合项函数删除,然后通过函数参数将状态值传进可组合项函数内。

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

Jetpack 系列之Paging3,看这一篇就够了~

通过上图我们也可以清晰看出来,Paging在仓库层、ViewModel和UI层都有具体表现,接下来我们通过一个示例来逐步讲解Paging是如何在项目架构工作。...上 我们在View代码调用viewModelgetData方法,代码如下所示: val manager = LinearLayoutManager(this) rv_data.layoutManager...上面我们在Activity创建了dataRecycleViewAdapter来显示页面数据,我们可以使用addLoadStateListener方法添加加载状态监听事件,如下所示: dataRecycleViewAdapter.addLoadStateListener...;而是对数据源进行操作,数据变化会自动更新到列表,看到评论区很多朋友说如何操作item删除和修改,这里我们使用最简单方式即可 对单个item修改 我们都知道RecycleView是没有直接监听...对数据删除、新增 我们都知道,在之前,我们给adapter设置一个List,如果需要删除或者新增,我们只要改变List即可,但是在Paging3好像没有办法,因为数据源是PagingSource ,

3.2K10

Jetpack 系列之Paging3,看这一篇就够了~

Paging在架构使用图 通过上图我们也可以清晰看出来,Paging在仓库层、ViewModel和UI层都有具体表现,接下来我们通过一个示例来逐步讲解Paging是如何在项目架构工作。...上 我们在View代码调用viewModelgetData方法,代码如下所示: val manager = LinearLayoutManager(this) rv_data.layoutManager...上面我们在Activity创建了dataRecycleViewAdapter来显示页面数据,我们可以使用addLoadStateListener方法添加加载状态监听事件,如下所示: dataRecycleViewAdapter.addLoadStateListener...;而是对数据源进行操作,数据变化会自动更新到列表,看到评论区很多朋友说如何操作item删除和修改,这里我们使用最简单方式即可 对单个item修改 我们都知道RecycleView是没有直接监听...即可,演示效果如下所示: 对数据删除、新增 我们都知道,在之前,我们给adapter设置一个List,如果需要删除或者新增,我们只要改变List即可,但是在Paging3好像没有办法,因为数据源是

1.8K20

Google 推荐在 MVVM 架构中使用 Kotlin Flow

MVVM 架构由 View + DataBinding + ViewModel + Model 组成,如下所示,我相信下面这张图大家非常熟悉了, ?...flow { ... } 执行,最后使用 emit() 方法更新数据,将数据发送给 ViewModel,代码如下所示: PokemonGo/app/src/main/java/com/hi/dhl/...ViewModel,接下来我们来看一下如何在 ViewModel 接受 Flow 发送数据。...DataBinding(数据绑定)实际上是 XML 布局另一个视图结构层次,视图 (XML) 通过数据绑定层不断地与 ViewModel 交互,如下所示: PokemonGo/app/src/main...一个是不可变,在 Activity 或者 Fragment 调用对外暴露不可变 LiveData 即可,如下所示: // 方法一 mViewModel.pokemon.observe(this,

4.1K20

C# WPF MVVM开发框架Caliburn.Micro View View Model 命名⑨

为了更好地了解这些新功能以及类型解析通常如何在框架工作,现在是详细描述框架支持开箱即用命名约定适当时机。...类型名称命名约定 本文档其他部分所述,视图及其伴生ViewModel最常见命名约定如下所示: 因为我们认识到“视图”是一个抽象术语,大多数应用程序主要“视图”实际上是某种“页面”,所以我们认为框架将...因此,该框架对该用例具有内置支持: 如果仔细检查,您会发现上面两个约定之间存在细微差异。“ViewModel”只是简单地添加到一个带有后缀名“页面”,以生成其ViewModel名称。...多视图支持命名约定 文档约定部分所述,该框架旨在处理ViewModel和View之间一对多关系。...这项公约可描述如下: 虽然许多应用程序所有视图和视图模型都可能位于单个部件,但通常做法是在项目中单独文件夹组织视图和视图模型。

90420

写给初学者Jetpack Compose教程,使用State让界面动起来

比如说,每次当手机横竖屏旋转时候,计数器都会重新归零,如下所示: 这是因为用于计数count变量是定义在Composable函数,虽然我们用remember函数将它包裹住了,但这只能保证它在...我们稍后就会讲解如何在Compose中使用ViewModel。 但如果你变量并不想定义在ViewModel当中,而是就得定义在Composable函数,我们仍然还是有其他解决方法。..." } 然后修改CallCounter函数代码,如下所示: import androidx.lifecycle.viewmodel.compose.viewModel @Composable fun...不用说,这个函数作用就是将Flow转换成State。 那么到这里,相信你已经了解如何在Compose无缝对接ViewModel了。...现在重新运行一下程序,效果如下所示: 可以看到,我们终于能够在Compose输入框输入内容了。

68220

Unity应用架构设计(5)——ViewModel之间如何共享数据

那么,如何在多个SubView之间 『共享数据』 是一个很棘手事情。...有经验JavaScript程序员想必早就记滚瓜烂熟了——通过内置属性 __proto__ 来实现。 所以ViewModel之间『共享数据核心就是如何去实现一个继承链,如下所示: ?...为ViewModel构建继承关系 有了上述分析之后,只要仿照JavaScript __proto__ 实现,我们对所有ViewModel基类ViewModelBase添加一个ParentViewModel...,可以通过 Ancestors扩展方法获取上层对象数据 var ancestors = this.Ancestors(); 最后,以图示形式会更加直观,下图所示...小结 本篇文章介绍了怎样在ViewModel之间共享数据,实际上解决方案是非常简单,人为构造了一个继承链并随着继承链往上找,总是能找到希望获取到数据

1.3K60

今天撸一波Jetpack下Lifecycle、ViewModel和LiveData

添加一个Observer时,它将接收导致当前状态所有事件。举例来说,如果Lifecycle目前在RESUMED状态,则观察员将收到ON_CREATE,ON_START和ON_RESUME事件。...② removeObserver():可以调用此方法从Lifecycle观察者列表删除给定观察者。从生命周期中删除观察者将不再接收任何触发事件。...LiveData处理逻辑如下所示: ? 3.1 setValue() 当调用LiveDatasetValue(T value)方法时,将设置LiveData持有的数据。...(key, viewModel); return (T) viewModel; } 源码所示,当调用此get()方法时,ViewModelProvider将检查ViewModelStore是否已具有该类类型现有...但是,如果不存在,那么将创建一个新ViewModel并将其添加到ViewModelStore。 获取到ViewModel 就可以使用里面的属性和方法来进行操作了。

1.5K10

无处安放业务逻辑使你在Android架构上吃了多少生硬亏,是否还在生搬硬套?

3.2 Android视图开发可以借鉴函数式编程思想 一、模块化意义何在?...举个例子如下图: image.png 相信很多人见过或者正在使用这种分包方式,在业务层把所有的Adapter、Presenter、Activity等等都放在对应,这种方式合理吗?...绊脚石: 通常来讲,我们通过网络请求拿到数据结构都是后端定义,这也就意味着视图层不得不直接使用后端定义字段,一旦后端进行业务调整会迫使我们前端从数据层-->视图层都会进行对应改动,如下伪代码所示:...引入diff之前: RecyclerView想要实现动态删除添加、更新需要分别手动更新数据和UI,这样在中间插了一道并且分别更新数据和UI已经违背了前面所说数据驱动UI,而我们想要是不管删除添加或者更新只有一个入口...(这也要求ViewModel,Repository函数要符合单一原则)。

1.6K00

C# WPF MVVM开发框架Caliburn.Micro快速搭建③

01 启动项目 打开Visual Studio 创建一个名为“Caliburn.Micro.Hello”新WPF应用程序 添加对Caliburn.Micro Nuget包引用,最新版本是4.0.173...,更新日期2021年5月9日 (2021/5/9) 删除“MainWindow.xaml”并从“App.xaml”删除StartupUri,使其如下所示: <Application x:Class=...为此,请更新App.xaml,将引导程序添加到您资源如下所示: 02 WPF <Application xmlns="http://schemas.microsoft.com/winfx/2006...资源和它将完成其余<em>的</em>工作。现在,运行应用程序。您应该看到<em>如下</em>内容: Caliburn.Micro创建了ShellViewModel,但不知道如<em>何在</em>没有视图<em>的</em>情况下渲染它。...<em>ViewModel</em>上<em>的</em>“Name”属性。

1.4K20

Jetpack-Compose 学习笔记(五)—— State 状态是个啥?又是新概念?

前面几篇笔记讲了那么多内容,都是基于静态界面的展示来说,即给我一个不变数据,然后将它展示出来。如何在 Compose 构建一个随数据而变化动态界面呢?相信看完这篇就知道了。...Composable 函数,也就是说,value 值改变了之后,所有引用了 value Composable 函数都会重新绘制更新。...这样,所有引用了 ViewModel MutableState 类型对象 inputStr 组合项(Composable 函数),都会自动重绘更新,Text 组件就可以实时更新输入内容了。...所以,remember 用法如下所示: // code 7 remember(key) { calculation: () -> T } remember 关键字可以为 Composable 组件项提供一个数据存储空间...所以,不要在有添加或移除 Composable 组件情况下,使用 remember 将重要内容存储在 Composable 组件,因为添加和移除都会使得数据丢失。 5.

2K30

Android从零开始搭建MVVM架构(4)——LiveData

当你更新LiveData对象存储数据时,所有注册了Observer,只要所绑定LifecycleOwner处于活动状态,就会被触发通知。...当LiveData对象所保存数据发生变化时,UI会在响应自动更新。 创建LiveData对象 LiveData是一个包装器,可用于任何数据,包括实现Collections对象,List。...一个 LiveData对象通常存储在ViewModel对象,并通过getter方法访问,如以下示例所示: public class NameViewModel extends ViewModel {...传递给switchMap()函数必须返回一个LiveData对象,如下所示: private LiveData getUser(String id) { ...; } LiveData...例如,如果在UI中有一个从本地数据库或网络获取更新LiveData对象,则可以将以下数据添加到MediatorLiveData对象: 与存储在数据数据关联LiveData对象。

2.2K30

Android Jetpack系列 之分页库Paging3(一)

通过上图我们也可以清晰看出来,Paging在仓库层、ViewModel和UI层都有具体表现,接下来我们通过一个示例来逐步讲解Paging是如何在项目架构工作。...,这里意思就是 我们传Int类型值(页码)得到返回数据信息DemoReqData对象。...() }.flow } 在viewmodel我们定义了一个getData方法,Pager通过配置PagingConfig来实现特殊定制,我们来看下PagingConfig参数如下:...上 我们在View代码调用viewModelgetData方法,代码如下所示: val manager = LinearLayoutManager(this) rv_data.layoutManager...getData方法,接收最新数据,通过PagingAdaptersubmitData方法为adapter提供数据,运行结果如下所示(忽略丑陋UI.jpg) ?

4K30

SQL Server 数据库权限设置

需要注意是:使用Windows身份验证时,也必须把相应用户账号添加数据登录名列表,否则还是会登录失败,如下所示: ?...最后,每个房间里都包含一些对象(椅子,计算机.铅笔等),可以把它们想象为数据表,并不是每个进入房间的人都有权使用这些对象。...一个用户可以拥有多个固定服务器角色权限,但是固定服务器角色不能被修改、添加删除。服务器角色如下所示: ?...2、数据库级别权限设置: 创建任何一个数据默认包含两个特殊用户 dbo(database owner)和guest,前者为数据所有者,对该数据库具有所有权限;后者是来宾账户,不能被删除,默认处于禁用状态且不具备任何权限...SQL server默认提供数据库角色如下所示: ?

2.4K20

C# WPF MVVM开发框架Caliburn.Micro 关于Conventions⑧

为了导出视图,我们假设您在vm命名中使用了文本“ViewModel”,因此我们只需通过删除单词“Model”将其更改为“view”。这具有更改类型名称和名称空间效果。...如果只想添加到现有行为,只需将现有Func存储在变量,创建一个调用旧函数新Func,然后将新Func分配给ViewLocator.LocateForModelType。...每当您使用UIElement上View.Model attached属性进行ViewModel首次合成渲染时,都会调用定位器以查看合成ViewModel应如何在UI该位置进行渲染。...,如下所示: <TextBlock...配置约定常用方法之一是向系统添加新约定。最常见情况是添加Silverlight toolkit控件或WP7 toolkit控件。

2.7K20

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

Compose 新闻App(二)ViewModel、Hlit、数据流 前言 正文 一、添加依赖 ① 添加Hilt依赖 ②添加ViewModel依赖 二、Hilt使用 三、ViewModel使用 四、数据流...:$hilt_version" } 添加位置如下所示: 下面是在appbuild.gradle配置:在顶部plugins{}闭包添加: id 'kotlin-kapt'...com.google.dagger:hilt-android-compiler:$hilt_version" 如下所示: 至此我们Hilt依赖添加完毕。...②添加ViewModel依赖 下面我们添加ViewModel依赖,其实主要就是对于在Compose使用ViewModel增强,依赖如下: implementation 'androidx.lifecycle...这里作用域很重要,因为普通函数如果没有作用域的话是无法调用可组合函数。 四、数据流 Compose 随附了一些扩展程序,它们适用于最热门基于流 Android 解决方案。

1.3K40
领券