Kotlin类型安全构建器的一次运用记录
时间:2022-07-27
本文章向大家介绍Kotlin类型安全构建器的一次运用记录,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
在android官方指导的相关应用框架中,用到一个Resource类来表示网络请求的状态与结果
// A generic class that contains data and status about loading this data.
sealed class Resource<T (
val data: T? = null,
val message: String? = null
) {
class Success<T (data: T) : Resource<T (data)
class Loading<T (data: T? = null) : Resource<T (data)
class Error<T (message: String, data: T? = null) : Resource<T (data, message)
}
大多数情况下我们在activity里面是这样用的
private val testViewModel : TestViewModel by viewModels()
private fun getUserInfo(uid: String) {
testViewModel.userInfoData.observe(this, Observer {
when (it.status) {
Status.SUCCESS - TODO()
Status.ERROR - TODO()
Status.LOADING - TODO()
}
})
testViewModel.setUserId(uid)
}
这样写多了感觉好烦,每次都是when(),有没有更爽的写法呢?比如这样?
private fun getUserInfo(uid: String) {
testViewModel.userInfoData.observe(this, Observer {
success {
}
error {
}
loading {
}
})
testViewModel.setUserId(uid)
}
当我只需要处理success的时候,我可以不写error/loading情况。
kotlin的类型安全构建器可以做到,我们先看下官方的示例
class HTML {
fun body() { …… }
}
fun html(init: HTML.() - Unit): HTML {
val html = HTML() // 创建接收者对象
html.init() // 将该接收者对象传给该 lambda
return html
}
html { // 带接收者的 lambda 由此开始
body() // 调用该接收者对象的一个方法
}
先分析下,我们需要的是一个实现了Observer接口的对象。
所以我们先定义一个类来实现Observer接口
class ResourceObserver<T: Any : Observer<Resource<T {
override fun onChanged(t: Resource<T ) {
when(t) {
is Resource.Success - TODO()
is Resource.Error - TODO()
is Resource.Loading - TODO()
}
}
}
实现一个顶层函数,返回一个ResourceObserver对象
fun <T: Any resourceObserver(init: ResourceObserver<T .() - Unit): ResourceObserver<T {
val observer = ResourceObserver<T ()
observer.init()
return observer
}
调用该函数即可得到ResourceObserver对象
resourceObserver {
//在此处可以调用对象内的成员函数
}
所以我的实现是
class ResourceObserver<T: Any : Observer<Resource<T {
private var success: (Resource.Success<T .() - Unit)? = null
private var error: (Resource.Error.() - Unit)? = null
private var loading: (Resource.Loading<T .() - Unit)? = null
fun success(s: (Resource.Success<T .() - Unit)) {
success = s
}
fun error(e: Resource.Error.() - Unit) {
error = e
}
fun loading(l: Resource.Loading<T .() - Unit) {
loading = l
}
override fun onChanged(t: Resource<T ) {
when(t) {
is Resource.Success - success?.invoke(t)
is Resource.Error - error?.invoke(t)
is Resource.Loading - loading?.invoke(t)
}
}
}
总结
到此这篇关于Kotlin类型安全构建器的一次运用记录的文章就介绍到这了,更多相关Kotlin类型安全构建器运用内容请搜索ZaLou.Cn以前的文章或继续浏览下面的相关文章希望大家以后多多支持ZaLou.Cn!
- 基于Github的源码白盒扫描工具Raptor
- 把业务逻辑变成数据结构和SQL语句的例子。自然架构改成自然框架
- 【自然框架】之通用权限(六):权限到节点
- 【自然框架】之“元数据”的威力
- 周末娱乐:讲真,这才是我所说黑客的定义!
- 数据访问函数库的使用方法(一)——添加修改数据
- 数据访问函数库的使用方法(二)—— 获取记录集和使用事务的方法
- “数据访问函数库”(DataAccessLibrary for .net2.0 )源代码下载 09.06.15更新
- 数据访问函数库 for ado.net2.0
- 【问底】静行:FastJSON实现详解
- 分页解决方案 —— GridView + QuickPager + QuickPager_SQL + DataAccessLibrary + 数据库
- 使用接口来统一控件的取值、赋值和初始化
- 【自然框架】之通用权限的Demo(二):添加人员、添加账户、添加角色里面的账户以及列表的权限验证
- 我自己写的一个分页控件(源码和演示代码)PostBack分页版 for vs2003、SQL Server
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 攻击Scrapyd爬虫
- 【webpack】从vue-cli 2x 到 3x 迁移与实践
- 前端单元测试那些事
- 前端Nginx那些事
- 前端运维部署那些事
- 《前端那些事》从0到1开发简单脚手架
- CDH7.1.1启用Kerberos
- 持续代码质量管理-SonarQube Scanner部署 2.1. 软件安装2.2. 配置修改
- 《前端那些事》聊聊前端的按需加载
- 直播带货系统,滚动视图,上滑隐藏,下滑显示
- 持续代码质量管理-SonarQube-7.3简单使用 2.1. 查看配置2.2. 质量检测2.3. 浏览器查看
- 安装指定版本的docker服务
- 你学BFF和Serverless了吗
- 如何使用Java连接Kerberos的Phoenix
- docker swarm的常用操作