当前位置: 首页 > news >正文

网站设计与制作教程网站建设实践心得体会

网站设计与制作教程,网站建设实践心得体会,价格低怎么说,电商推广技巧这篇涉及到的知识点: 扩展函数:Kotlin 扩展函数详解_kotlin扩展函数-CSDN博客 设计模式: builder 模式 :建造者模式(Builder)-CSDN博客 高阶函数 :Kotlin --- 函数,高阶函数_ko…

这篇涉及到的知识点:  

扩展函数:Kotlin 扩展函数详解_kotlin扩展函数-CSDN博客

设计模式: builder 模式 :建造者模式(Builder)-CSDN博客

高阶函数 :Kotlin --- 函数,高阶函数_kotlin 高阶函数-CSDN博客

 高阶函数,父子组件:  Compose 父子组件的通信_jetpack compose 子组件数据传递-CSDN博客

详细解释这个 configure 方法的语法和工作原理:

configure 方法解析

语法分解

fun configure(init: EventConfig.() -> Unit): EventHandlerManager {eventConfig = EventConfig().apply(init)return this}

各部分含义

init: EventConfig.() -> Unit

  • init 是参数名
  • EventConfig.() 是带接收者的函数类型
  • -> Unit 表示函数返回 Unit(无返回值)

EventConfig.() 是什么?

  • 这是 Kotlin 的扩展函数语法
  • 表示这个函数在 EventConfig 对象内部执行
  • 函数内部可以直接访问 EventConfig 的属性和方法

EventConfig().apply(init)

  • EventConfig() 创建新对象
  • .apply(init) 在新对象上执行 init 函数

apply { }  和apply()  区别?

真正的区别是:

  • apply { } 是直接写代码块
  • apply(init) 是通过函数参数传入代码块

但执行时机是相同的,都是立即执行。

实际使用示例

调用方式

// 调用方式eventHandlerManager.configure {// 这里的 this 就是 EventConfig 对象addValidator { rect -> rect != null }addHandler(EventType.CHAT) { rect ->handleChat(rect)}}

执行过程

// 1. 创建新的 EventConfig 对象val newConfig = EventConfig()// 2. 在 newConfig 上执行配置函数newConfig.apply {addValidator { rect -> rect != null }addHandler(EventType.CHAT) { rect ->handleChat(rect)}}// 3. 将配置好的对象赋值给 eventConfigeventConfig = newConfig

游戏类比

就像角色创建界面:

// 创建角色val character = Character()// 配置角色属性character.apply {name = "战士"level = 10weapon = "剑"armor = "铁甲"}// 使用配置好的角色player.character = character

等价的传统写法

传统方式
// 传统方式fun configureTraditional(): EventHandlerManager {val config = EventConfig()config.addValidator { rect -> rect != null }config.addHandler(EventType.CHAT) { rect ->handleChat(rect)}eventConfig = configreturn this}
扩展函数方式
// 使用扩展函数的方式(当前实现)fun configure(init: EventConfig.() -> Unit): EventHandlerManager {eventConfig = EventConfig().apply(init)return this}

调用对比

// 传统方式调用eventHandlerManager.configureTraditional()// 扩展函数方式调用(更优雅)eventHandlerManager.configure {addValidator { rect -> rect != null }addHandler(EventType.CHAT) { rect ->handleChat(rect)}}

为什么这样设计?

  1. 链式调用:return this 支持链式调用
  2. 代码块:{} 提供配置代码块
  3. 作用域:在 EventConfig 作用域内执行
  4. 简洁性:比传统方式更简洁

完整示例

// 配置事件处理器eventHandlerManager.configure {// 添加验证器addValidator { rect -> rect != null }addValidator { rect -> rect.text.isNotEmpty() }// 添加事件处理器addHandler(EventType.CHAT) { rect ->Log.d("Chat", "处理聊天事件: ${rect.text}")}addHandler(EventType.PDF) { rect ->Log.d("PDF", "处理PDF事件: ${rect.text}")}}.registerAllHandlers()  // 链式调用
    /*** 注册所有事件处理器* 根据配置注册相应的事件处理器*/fun registerAllHandlers() {eventConfig.handlers.forEach { (type, handler) ->registerHandler(type, handler)}Log.d(TAG, "所有事件处理器注册完成")}
    /*** 注册单个事件处理器* @param type 事件类型* @param handler 处理函数*/private fun registerHandler(type: EventType, handler: (ColoredRect) -> Unit) {when (type) {EventType.CHAT -> deepLearnView.registerButtonClickHandler(RectType.START_CHAT) { rect ->if (validateRect(rect)) {handler(rect)}}EventType.QUESTION -> deepLearnView.registerQuestionConfirmButtonClickHandler { rect ->if (validateRect(rect)) {handler(rect)}}EventType.QUESTION_BUTTON -> deepLearnView.registerQuestionButtonClickHandler(0) { rect, buttonIndex, buttonText ->if (validateRect(rect)) {// 这里需要特殊处理,因为问答按钮处理器有额外参数// 可以扩展 EventConfig 来支持带参数的处理函数handler(rect)}}EventType.OCR -> deepLearnView.registerOcrButtonClickHandler { rect ->if (validateRect(rect)) {handler(rect)}}EventType.OCR_ADD_IMAGE -> deepLearnView.registerOcrAddImageClickHandler { rect ->if (validateRect(rect)) {handler(rect)}}EventType.PDF -> deepLearnView.registerButtonClickHandler(RectType.PDF) { rect ->if (validateRect(rect)) {handler(rect)}}EventType.SEARCH -> deepLearnView.registerButtonClickHandler(RectType.SEARCH) { rect ->if (validateRect(rect)) {handler(rect)}}}}

这样设计让配置代码更加优雅和直观,就像在配置一个对象一样!

http://www.dtcms.com/a/562762.html

相关文章:

  • 怎样做网站海报免费开店的外贸平台
  • 11月2日
  • 兰州网站移动端优化兰州新站点seo加盟
  • 事务视图的知识总结
  • 高端的响应式网站建设公司镇江网络广播电视
  • 网站建设企业资质邀请推广app
  • 国内有什么网站山西通州集团网站建设
  • 富阳网站建设怎样公司手机网站开发招标书
  • 建立网站目录结构的原则郑州seo优化培训
  • 大连有几家做网站的公司管理系统开发
  • 做的网站在百度上搜不出来的那个网站做logo兼职
  • 淘宝客网站域名谁会做中装建设公司
  • 检测网站为什么打不开了上海广告公司大全
  • 做网站得多长时间企业网站是如何做的
  • html5网站建设公司东光县建设局网站
  • cesium126,230331,Visualize Per-Feature Metadata - 1:官方教程
  • 深圳外包公司网站怎么搭建局域网网站
  • 网站设计 加英文费用推广公司怎么找
  • 做淘客要有好的网站郑州制作网站推荐
  • python代码给文件批量重命名
  • 做电影网站只放链接算侵权吗安徽建设工程信息管理平台
  • 【正点原子 D20 WiFi 模块】介绍、配置、工程测试
  • Linux 下 tar 命令详解:归档与压缩完整指南
  • 戚墅堰做网站wordpress调用 自定义php代码
  • 巩义市住房和城乡规划建设局网站建站网站加盟
  • 有关网站建设的视频梅林固件 搭建wordpress
  • 网络层计算题
  • 网站建设要后台吗个人网站建设图片素材
  • 企业网站群建设怎么推广比较好
  • 网站建设收费标准方案wordpress 页面模板不显示不出来