自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(55)
  • 收藏
  • 关注

原创 Jetpack Compose 中 Kotlin 协程的使用

这篇文章系统介绍了Jetpack Compose中协程的使用方法和最佳实践。主要内容包括:协程在Compose中的必要性、作用域体系、专属API全景图、典型业务场景实战、生命周期管理、性能优化技巧和常见陷阱解决方案。文章通过对比不同作用域的生命周期,详细讲解了ViewModel层和UI层的协程使用,并提供了数据加载、Flow订阅、副作用处理等实用代码示例。最后强调了不可变数据、单一数据源等优化原则,帮助开发者编写高效稳定的Compose代码。

2025-07-16 17:58:34 379

原创 告别Hilt,拥抱简洁高效的依赖管理

本文提出了一种创新的Android架构设计——基于AppContainer的无Hilt方案,旨在解决传统DI框架的痛点。该架构通过AppContainer集中管理依赖,采用延迟初始化和单一职责原则,实现了简洁高效的依赖管理。核心包含AppContainer(依赖管理中心)、BaseViewModel(统一状态管理)和ViewModelFactory(Compose集成)三大组件。相比Hilt,该方案具有学习成本低、编译速度快、调试友好等优势,并通过实际案例展示了在登录功能中的完整实现流程。性能测试显示,该架

2025-07-15 14:27:05 383

原创 Android Jetpack Compose 状态管理介绍

本文全面介绍了Jetpack Compose的状态管理方案。首先解释了基础概念,通过电灯开关类比说明状态与UI更新的关系。然后详细对比了remember和rememberSaveable的区别,并分析了状态作用域问题。重点讲解了状态提升模式,通过购物车案例展示如何共享状态。对于复杂场景,介绍了ViewModel和StateHolder两种方案:ViewModel适合屏幕级业务逻辑,提供TodoList完整实现;StateHolder模式通过搜索功能案例演示了细粒度状态管理。最后给出项目结构建议和常见问题解决

2025-07-11 18:11:55 1107

原创 从零开始:手把手教你用 Uniapp 搭建多平台应用

本文介绍了一款支持跨平台开发的Vue框架,可一套代码同时适配Android、iOS和鸿蒙系统。该框架采用最新技术栈(Vue3+TypeScript+Pinia+SCSS),提供开箱即用的功能模块,包括网络请求、本地存储和常用组件等。项目采用模块化结构设计,核心功能包含状态管理(Pinia)和网络请求封装,前者统一管理应用数据状态,后者简化服务器通信流程。通过热重载等技术提升开发效率,使开发者无需维护多套代码即可实现多平台应用开发。

2025-07-10 17:26:39 268

原创 HarmonyOS 中状态管理 V2和 V1 的区别

鸿蒙ArkUI框架的ComponentV2相较V1在状态管理和开发模式上实现重大优化。V2通过@ObservedV2+@Trace支持深度属性观测,避免V1的浅层观察缺陷;采用@Param/@Event简化组件间通信,替代V1的@Prop/@Link复杂机制;新增组件冻结功能提升复用性能。V2还减少代理层级,支持计算属性按需更新,并兼容V1组件渐进迁移。建议新项目直接采用V2,现有项目优先改造状态管理模块。

2025-07-09 12:13:08 463

原创 HarmonyOS中各种动画的使用介绍

摘要:鸿蒙系统(HarmonyOS)提供全面的动画解决方案,包括属性动画、显式动画、转场动画、帧动画、粒子动画和路径动画等类型。属性动画通过animateTo实现组件属性平滑过渡,转场动画支持页面切换效果,帧动画适合逐帧控制,粒子动画可创建复杂视觉效果。开发者应注意性能优化,如合并动画闭包、减少布局属性动画等。系统支持从简单交互到复杂场景的动画需求,需根据具体场景选择合适类型并参考官方实践案例。

2025-07-09 10:57:00 686

原创 从卡顿到丝滑:uni-app房产App性能优化实践

在移动互联网时代,用户对应用性能的要求越来越高。据统计,如果一个应用的启动时间超过3秒,将有53%的用户选择放弃使用。对于房产行业的移动应用来说,性能优化更是至关重要,因为它直接影响到用户的看房体验和决策效率。

2025-07-07 10:52:55 817

原创 状态机管家:MeScroll 的交互秩序维护

MeScroll是一个高性能滚动解决方案,采用分层架构设计,包含事件控制、状态管理、性能优化和适配抽象四大核心模块。通过三维触摸跟踪模型和防误触算法实现精准控制,运用状态机管理交互流程。采用虚拟滚动、事件节流、硬件加速等技术大幅提升性能,其中长列表渲染内存节省80%,帧率达60fps。支持多端适配,通过WXS优化小程序性能,开发效率提升50%。整体方案在事件处理、列表渲染和跨平台兼容性方面均有显著优势。

2025-07-04 14:46:03 836

原创 Android开发的华丽转身:从onActivityResult到ActivityResultLauncher的完美蜕变

ActivityResultLauncher是Android Jetpack引入的新API,用于替代传统的startActivityForResult(),解决了内存泄漏、代码分散和类型不安全等问题。它通过泛型提供类型安全,自动处理生命周期,将启动和回调逻辑集中管理。使用时需在Activity/Fragment中注册,支持图片选择、权限请求等常见场景。内置多种Contract如GetContent、TakePicture等,也支持自定义Contract。相比传统方式,ActivityResultLaunch

2025-07-04 14:16:03 729

原创 UniApp 中实现智能吸顶 Tab 标签导航效果

摘要:本文介绍了一种在UniApp中实现的智能吸顶Tab导航组件方案。该组件具备智能显示/隐藏、自动高亮切换、平滑滚动定位等功能,通过动态计算内容区域位置,结合节流优化和状态管理,确保流畅交互体验。文章详细剖析了组件结构设计、核心方法实现、生命周期管理和性能优化策略,并针对常见问题提供了解决方案。该方案已在生产环境验证,可直接应用于实际项目开发。(150字)

2025-07-03 10:53:24 490

原创 UniApp 加载 Web 页面完整解决方案

本文介绍了一套完整的UniApp WebView解决方案,实现H5页面与UniApp的无缝集成。针对传统WebView插件依赖原生代码、通信复杂等问题,采用UniApp官方SDK实现双向通信、页面跳转、文件上传等功能。方案包含WebView页面组件、路由配置、通信方法封装和业务模板,通过标准化接口实现稳定交互。核心包括SDK引入、环境检测、消息通信机制和跨平台适配,解决了SDK加载、通信失败等常见问题。该方案简化了开发流程,提升了维护性,已在项目中验证满足各类H5集成需求,实现了接近原生应用的使用体验。

2025-07-02 14:02:29 532

原创 HarmonyOS 页面路由Router切换组件导航Navigation

Router切换Navigation主要需要主要以下几点,页面配置和生命周期有点区别,Navigation具有更强的功能和自定义能力,目前最新版本的 api中已经废弃Router相关方法,推荐使用Navigation组件作为应用的路由框架。组件导航(Navigation)主要用于实现页面间以及组件内部的页面跳转,支持在不同组件间传递跳转参数,提供灵活的跳转栈操作,从而更便捷地实现对不同页面的访问和复用。当用户在一个页面完成操作后,通常需要返回到上一个页面或者指定页面,这就需要用到页面返回功能。

2025-07-02 09:48:48 1328

原创 HarmonyOS中自定义半模态弹窗

鸿蒙 ArkUI 自定义弹出框实践 本文介绍了在鸿蒙 ArkUI 中使用半模态弹窗替代 Dialog 的实现方案。通过对比发现,Dialog 的动画效果会影响整个蒙层,而半模态弹窗仅作用于视图层,动画效果更符合预期。文章详细展示了如何使用 harmony-dialog 三方库中的 DialogHelper 类创建底部列表弹窗,包括参数配置、自定义组件构建和数据传递。重点说明了 BottomListOptions 的参数传递机制和 BottomListBuild 组件的实现细节,确保半模态弹窗的数据能够及时刷

2025-06-27 10:45:13 306

原创 HarmonyOS V2 状态管理中@Build 方法状态更新

摘要:本文介绍如何使用@Builder装饰器实现可复用的UI组件布局。通过创建FieldParam类并用@ObservedV2和@Trace装饰,可实现数据变化时的UI自动刷新。关键点包括:1)采用引用传递而非值传递参数;2)使用@ObservedV2和@Trace确保数据变化可被观测;3)示例展示了外出地点选择组件的实现,包括页面跳转和数据回传逻辑。这种方式既保证了组件复用性,又实现了数据绑定和自动刷新功能,特别适用于需要动态更新UI的场景。

2025-06-27 10:43:16 429

原创 UniApp 自定义滚动条实现

在移动端开发中,系统默认的滚动条往往无法满足UI设计的需求。本文将详细介绍如何在UniApp中实现一个完全自定义的滚动条,该滚动条不仅外观可控,还能根据内容比例动态调整宽度,提供更好的用户体验。

2025-06-26 16:05:50 1117

原创 uniapp 和原生插件交互

参考 uniapp 官网配置好,在 HBuildX 中奖 uniapp 项目生产本地打包资源,将打包好的资源文件放在原生工程的 src->assets->apps 目录下。新建一个类Testmodule 基层自 UniModule 类,建议使用的,此类已经存在,此类相当于是 uniapp 和原生插件的桥梁。所有需要交互的人口,交互都可以写在这里。

2025-06-26 15:56:20 978

原创 HarmonyOS Next中的弹出框使用

弹出框是一种模态窗口,通常用于在保持当前上下文环境的同时,临时展示用户需关注的信息或待处理的操作。用户需在模态弹出框内完成相关交互任务之后,才能退出模态模式。弹出框可以不与任何组件绑定,其内容通常由多种组件组成,如文本、列表、输入框、图片等,以实现布局。ArkUI当前提供了自定义和固定样式两类弹出框组件。开发者需要根据使用场景,传入自定义组件填充在弹出框中实现自定义的弹出框内容。主要包括基础自定义弹出框 (CustomDialog)、不依赖UI组件的自定义弹出框 (openCustomDialog)。

2025-03-18 18:30:37 842

原创 HarmonyOS Next 中的状态管理

在声明式UI编程框架中,UI是程序状态的运行结果,用户构建了一个UI模型,其中应用的运行时的状态是参数。当参数改变时,UI作为返回结果,也将进行对应的改变。这些运行时的状态变化所带来的UI的重新渲染,在ArkUI中统称为状态管理机制。

2025-03-10 09:56:00 1108 1

原创 HarmonyOS Next 实现敲木鱼小游戏

是一款具有禅意的趣味小游戏,本文将通过鸿蒙 ArkUI 框架的实现代码,逐步解析其核心技术点,包括等。

2025-02-27 11:32:54 1120

原创 HarmonyOS Next 实现 2048 小游戏

通过 ArkUI 的声明式 UI 和状态管理,可以高效实现 2048 的核心逻辑。矩阵旋转简化方向处理状态驱动 UI 自动更新触摸事件与动画的流畅结合鸿蒙 ArkUI 实现 2048 小游戏。

2025-02-27 11:31:12 548

原创 HarmonyOS Next 实现多级树型列表选择器

开发ERP系统的时候经常会用到部门树列表,页面主要由搜索框、顶部部门面包屑、多层级部门列表组成,部门列表项由不么名称和下一级右边箭头组成,点击部门名称区域可以回传部门数据到上一个页面,点击下一级箭头按钮可以展示下一级部门列表,同时将父级部门添加到顶部面包屑。

2025-01-06 14:13:31 730

原创 HarmonyOS Next 实现地图找房功能

以上就是鸿蒙 ArkUI实现地图找房的基本流程,具体细节可以根据自己的业务需求,实现自己想要的效果。目前地图上的制定 marker 还是通过自定义组件生成图片,来展示,当Marker比较多时,对性能可能有一定的影响,可以进一步优化,每次只展示当前屏幕内的 Marker图,滑动移除屏幕外的 marker,同时记录已经生成的 marker,避免每次都要重新生成 marker PixelMap对象。

2025-01-06 14:07:05 1051

原创 ArkUI自定义TabBar组件

由于指示器需要跟随内容视图一起滑动切换,所以指示器不能在单个tabBuilder中设置。1、使用Column组件定义底部指示器,设置一个宽度为文字宽度,高度为3的蓝色指示器;2、这里的指示器宽度可以动态设置成文字的宽度,也可以直接设置成文字某个固定宽度;3、指示器距离左边的距离需要动态设置,配上动画,可以实现指示器跟随手指滑动。Stack() {}.tabBar(this.tabBuilder("房源", 0, $r("app.media.trip_data_start_bg")))...

2024-10-21 14:13:25 1174

原创 HarmonyOS 中自定义滚动条实现

本文介绍了在鸿蒙系统中实现滑动组件底部指示器跟随手势滑动效果的方法。通过自定义RectIndicator组件,使用Stack布局嵌套两个矩形(背景和进度条),动态设置进度条的左边距来实现滑动效果。关键点包括:1) 使用Rect绘制矩形指示器;2) 监听Scroll组件的onDidScroll事件获取滑动偏移量;3) 通过计算比例关系实时更新指示器位置;4) 使用@State注解确保UI实时刷新。该方法适用于需要展示滑动进度的场景,通过参数配置可灵活调整指示器样式。

2024-10-21 14:09:41 489

原创 Compose和AndroidView的交互

参数主要是用来初始化AndroidView布局,将AndroidView布局通过工厂模式转换成ComposeUI加载到Compose中,只会执行一行,第二个回调函数,主要是用来更新UI数据,LiveData是JetPack组件的一部分,主要是在AndroidView中用来监听数据的变化,并且具有生命感知的,只有在Activity等处于活动才会触发数据更新。由于在AndroidView中常用LiveData来进行数据的订阅,而在Compose中使用的是Compose特有的。对象,在Compose中使用。...

2022-09-01 14:04:43 1521

原创 Compose实现一个带复选框的列表

像对于文本,复选框多了一个选中改变的回调,我们需要再回调中处理数据的绑定,不然点击复选框会没有反应。我们可以通过这个回调来将数据和控件进行绑定,以及处理一些业务逻辑。这里需要把这个回调抛到上一级去来处理列表数据的选中状态的更新。11~14行加载了一个复选框控件,复选框相对于其他控件会多一个选中回调,类似的还有输入框控件。的布局 ,回调函数拿到是否是选中的数据,用来更新数据源集合。3~5行代码是定义了一个变量用来存放复选框的选中状态,使用。,创建一个按钮,点击后用来展示选中几个。的布局,如果要是加载多个。..

2022-09-01 14:02:47 890

原创 JetPack Compose 底部导航栏实现

---highlight: a11y-lighttheme: scrolls-light---开发一个新项目,底部导航栏一般是首页的标配,在以前的xml布局中,我们可以很轻松的是用谷歌提供的`BottomNavigationView`或者自定义来实现底部导航的功能,在Compose中也有也提供了一个类似的控件`androidx.compose.material.BottomNavigation`。#### 1.声明导航栏数据源主要声明导航栏label和图标数组,这里使用的是本地数据,也可以使用

2021-10-11 15:46:16 1686

原创 Jetpack Compose之布局介绍

Jetpack Compose 是用于构建原生界面的新款 Android 工具包。它可简化并加快 Android 上的界面开发。使用更少的代码、强大的工具和直观的 Kotlin API,快速让应用生动而精彩。一.标准布局组件Compose中可以将多个控件元素组合使用,例如下面这样,@Composablefun WidgetGroup() { Text(text = "不为往事扰") Text(text = "余生只愿笑")}但是我们会发现,如果仅仅是这样,两个文本控件会重叠在一

2020-11-25 17:34:33 1139 1

原创 使用Activity Results API来替代onActivityResult

说到onActivityResult,我们已经非常熟悉来,通过在A activity启动B activity并且传入数据到B中,然后在A中通过onActivityResult来接收B中返回的数据。在最新的activity-ktx的beta版本中,谷歌已经废弃了onActivityResult。 @SuppressWarnings("deprecation") @Override @CallSuper protected void onActivityResult(int reque

2020-10-29 16:51:01 1575

原创 SwiftUI之NavigationView用法

NavigationView是SwiftUI应用程序最重要的组件之一,它使我们能够轻松推送和弹出屏幕,以清晰,分层的方式向用户展示信息。NavigationView一般用在页面的最外层。可以在其内部添加标题栏,页面内容,以及底部导航栏等等。我们可以很方便的使用NavigationView来为页面添加标题栏,假设这个页面内容只有一个“Hell World”,那么我们可以这样为页面中添加标题栏NavigationView { Text("Hello, World!") .naviga

2020-10-29 16:49:40 1252

原创 android中kotlin协程和线程的关系

一.子线程和主线程的频繁切换假设现在有这样的一个业务逻辑,有3个耗时操作,耗时1函数执行完毕后,我们需要调用函数1更新UI,再执行耗时2函数,执行完毕后我们在调用函数2更新UI,最后执行耗时3函数,再调用函数3更新UI。1.定义3个不同的耗时操作函数和3个更新UI的函数 fun ioCode1() { println("我是IO线程1==${Thread.currentThread().name}") } fun ioCode2() { prin

2020-09-23 17:56:00 2193

原创 Flutter项目中构建Web工程以及发布nginx服务

Flutter的beat通道已经支持对web的支持,通过 Web 支持,你可以将使用 Dart 编写的现有 Flutter 代码编译为可以嵌入浏览器,并部署到任何 Web 服务器上,具有客户端体验的 Web 应用。你可以使用 Flutter 的所有功能,而不需要任何浏览器插件。使用Flutter构建Web应用1.创建一个支持Web的新项目如果你不知道自己的FLutter的channel版本,你可以使用flutter channel命令来查看Flutter通道:caojingMBP:~ caojin

2020-09-07 17:27:23 1177

原创 Flutter学习八之滑动组件ListView和GridView的使用

今天我们用Flutter来实现这样的一个页面,类似于一个分组列表,在Android 中如果要实现一个这样的页面,实现想到的肯定是RecycleView,然后通过在adapter中设置两个item样式根据在数据中新增一个标示来区分是标题还是内容,一个控件就能搞定,但是在Flutter中并没有适配器的概念,那如果要实现这样的一个布局该怎么办?通过分析页面得知,这应该是一个ListView嵌套一个GridView来实现的,在Android中RecycleView还没出来之前,我们如果要实现这样的一个布局,常用

2020-09-03 17:04:40 1210

原创 十进制和二进制转换原理

十进制是有0到9的数字组成的,二进制则是有0,1两个数字组成,那么为什么人类的计数方式是十进制,电脑的计数方式是二进制呢,十进制和二进制的本质是什么,他们是不是有什么共同点,或者说计数方式的通用点,十进制怎么转换成二进制,他们能不能快速进行转换。1.我们来了解一下我们比较常用的十进制数,比如数字 13245 这是一个五位数,从左➡️右分别有个,十,百,千,万组成的那么可以将十进制数据转换成下面这样13245=1*10000+3*1000+2*100+4*10+5*1 =1*10⁴+2*10³+

2020-08-26 19:25:38 4678 1

原创 Flutter学习七之实现一个简单的页面基类,支持全局控制页面状态

在Android 中可以定义Activity基类,所有可以在基类定义一些公共方法,比如全局标题栏,页面跳转动画,那么子啊FLutter中是不是也可以定义一个页面的基类,今天就来尝试一下。首先我们定义一个抽象类BaseWidget,该类继承自StatefulWidget,代码如下:abstract class BaseWidget extends StatefulWidget { @override BaseWidgetState createState() => getState();

2020-08-24 22:44:17 1015

原创 Flutter中滑动出现_positions.isNotEmpty异常解决办法

昨天从其他页面回到首页,滑动banner图切换时发现一个错误,虽然没有导致崩溃,但是总是觉得不舒服:Unhandled Exception: 'package:flutter/src/widgets/scroll_controller.dart': Failed assertion: line 110 pos 12: '_positions.isNotEmpty': ScrollController not attached to any scroll views.#0 _Assertion

2020-08-22 13:52:00 2865

原创 使用属性动画ObjectAnimator来实现控件动画

前段时间,公司新开发的VR找房,需要用到一个标示VR房源的动画控件,效果图是下面这种动画效果:首先分析GIF图得知,这组动画又一个圆圈和上下两个扇形组成,通过改变扇形图片的透明度,和位移来实现动画效果。然后我们在布局中先定义3个ImageView来组合这个动画中的元素: <ImageView android:id="@+id/ivVrBorder" android:layout_width="60dp" android:layout_height

2020-08-22 00:07:48 934

原创 利用kotlin协程和retrofit2,LiveData,ViewModel实现一个简单的网络请求框架

今天我们利用LiveData,ViewModel,retrofit2,kotlin协程来搭建一个MVVM的网络请求框架,利用数据来驱动UI更新变化,将数据和UI进行分离。1.新建一个ApiService接口,由于我们常用的网络请求是get和post,所以这里利用retrofit定义这两张请求类型的公共方法,由于retrofit2中已经支持了对协程的支持,所以抽取的get和post方法如下:interface ApiService { @GET suspend fun <T&gt

2020-08-20 00:41:03 1925 1

原创 Flutter学习六之实现一个带筛选的列表页面

上期实现了一个网络轮播图的效果,自定义了一个轮播图组件,继承自StatefulWidget,我们知道Flutter中并没有像Android中activity的概念。页面见的跳转是通过路由从一个全屏组件跳转到另外的一个全屏组件,那如果我想在A组件中更新B组件的数据应该怎么实现呢?今天我们来实现一个支持筛选的列表页面。前面我们已经实现来一个支持下拉刷新和上拉加载更多的列表组件,这里就不在做更多介绍来,效果图如下:通过点击左滑菜单筛选列表的数据。由于列表在之前的一篇文章已经说明过Flutter学习四之实现一

2020-08-19 00:05:25 1630

原创 Flutter学习五之网络请求和轮播图的实现

上期讲到了,怎样实现一个下拉刷新和加载更多的列表,数据更新,需要使用到网络请求,在flutter中,怎样实现一个网络请求呢 官方使用的是dart io中的HttpClient发起的请求,但HttpClient本身功能较弱,很多常用功能都不支持。所以这里我们直接使用国内的开源库 dio,dio是一个强大的Dart Http请求库,支持Restful API、FormData、拦截器、请求取消、Cookie管理、文件上传/下载、超时、自定义适配器等功能。首先我们导入开源库dio,目前的最新版本是 dio: ^

2020-08-17 01:26:16 372

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除