<?xml version="1.0" encoding="utf-8" ?><rss version="2.0"><channel><title><![CDATA[HugMua的博客]]></title><description><![CDATA[个人学习笔记总结]]></description><link>https://blog.youkuaiyun.com/HugMua</link><language>zh-cn</language><generator>https://blog.youkuaiyun.com/</generator><copyright><![CDATA[Copyright &copy; HugMua]]></copyright><item><title><![CDATA[网络 - Ktor（Retrofit 迁移版）]]></title><link>https://blog.youkuaiyun.com/HugMua/article/details/166645411</link><guid>https://blog.youkuaiyun.com/HugMua/article/details/166645411</guid><author>HugMua</author><pubDate>Fri, 25 Sep 2026 20:57:16 +0800</pubDate><description><![CDATA[直接复用 OkHttp 设置，只需要将 Retrofit 配置的替换掉。从「声明式注解」变成「显式函数调用」。]]></description><category></category></item><item><title><![CDATA[Compose - 图像]]></title><link>https://blog.youkuaiyun.com/HugMua/article/details/166596608</link><guid>https://blog.youkuaiyun.com/HugMua/article/details/166596608</guid><author>HugMua</author><pubDate>Thu, 24 Sep 2026 17:26:00 +0800</pubDate><description><![CDATA[Image 用于加载位图或矢量图，Icon 用于加载 Material 图标库提供的图标（该库已不再推荐使用，通过提供资源）。参数 contentDescription 用于提供无障碍服务，会被 TalkBack 朗读出来因此需要设置有意义的文本描述，如果该组件为纯装饰作用就赋值 null。]]></description><category></category></item><item><title><![CDATA[Android Studio - 应用签名]]></title><link>https://blog.youkuaiyun.com/HugMua/article/details/165891756</link><guid>https://blog.youkuaiyun.com/HugMua/article/details/165891756</guid><author>HugMua</author><pubDate>Fri, 18 Sep 2026 23:40:53 +0800</pubDate><description><![CDATA[生成密钥：由于密钥建议跟APP一对一，如果此时是另一个 APP 要生成自己的密钥 → Key alias → Create a new key，会在同一个密钥库中生成其它密钥，注意密钥名称跟APP相同。选择密钥：Key alias → Use an existing key 选择上一步创建的 → OK → Key password 输入密码 → Next。选择密钥库：菜单栏 Build → Generate Signed Bundle/APK → APK → Choose existing。]]></description><category></category></item><item><title><![CDATA[Android Studio - 构建变体 Build Variants]]></title><link>https://blog.youkuaiyun.com/HugMua/article/details/165888192</link><guid>https://blog.youkuaiyun.com/HugMua/article/details/165888192</guid><author>HugMua</author><pubDate>Fri, 18 Sep 2026 23:14:53 +0800</pubDate><description><![CDATA[Gradle 通过组合构建类型（Build Types）和产品风味（Product Flavors） 来生成构建变体（Build Variants），以此从单个项目创建不同版本的应用，如免费版与付费版、调试版与发布版。命名规则为 <产品风味><构建类型> ，例如 freeDebug、paidRelease 等。Gradle 在构建时会按照优先级（构建变体 > 构建类型 > 产品风味 > main）合并这些源集的文件。例如，src/free/ 下的代码只会被 free 变体使用。]]></description><category></category></item><item><title><![CDATA[网络 - 异常封装]]></title><link>https://blog.youkuaiyun.com/HugMua/article/details/165493436</link><guid>https://blog.youkuaiyun.com/HugMua/article/details/165493436</guid><author>HugMua</author><pubDate>Wed, 16 Sep 2026 11:13:27 +0800</pubDate><description><![CDATA[网络层统一异常，携带分类好的 ApiError。包一层 ApiException 而不是直接抛 ApiError 是因为 Kotlin 的协程和 Retrofit 的异常传播机制都是围绕 Throwable 的，用异常才能"自动向上冒泡"，调用链中间层不用层层判空。而 ApiError 作为数据挂在异常上，负责分类。]]></description><category></category></item><item><title><![CDATA[Compose 适配 - 分辨率（密度）]]></title><link>https://blog.youkuaiyun.com/HugMua/article/details/163054335</link><guid>https://blog.youkuaiyun.com/HugMua/article/details/163054335</guid><author>HugMua</author><pubDate>Mon, 20 Jul 2026 20:41:54 +0800</pubDate><description><![CDATA[px = sp * fontScale * density，fontScale 代表当前系统字体的缩放比例，通过 LocalDensity.current.fontScale 获取该值，可以自由控制应用内文字的显示大小。得益于 CompositionLocalProvider 特性，能细腻度的控制修改后的密度生效范围（当前Activity甚至某个组合中）而不会影响全局，由次解决了View体系适配中字节跳动方案的缺点。提供了一些现有参数，用来根据可用空间调用不同的布局方案。]]></description><category></category></item><item><title><![CDATA[Compose 适配 - 自适应导航 NavigationSuiteScaffold]]></title><link>https://blog.youkuaiyun.com/HugMua/article/details/163053257</link><guid>https://blog.youkuaiyun.com/HugMua/article/details/163053257</guid><author>HugMua</author><pubDate>Mon, 20 Jul 2026 19:01:48 +0800</pubDate><description><![CDATA[{HOME(Icons.Default.Home, "首页"),MALL(Icons.Default.ShoppingCart, "商城"),MESSAGE(Icons.Default.Email, "消息"),MINE(Icons.Default.Person, "个人")//底部导航栏selectedIconColor = AppColors.red, //选中后的图标颜色selectedTextColor = AppColors.red, //选中后的文字颜色。]]></description><category></category></item><item><title><![CDATA[Compose 适配 - 自适应布局（窗口尺寸类别 WindowSizeClasses、窗格Pane）]]></title><link>https://blog.youkuaiyun.com/HugMua/article/details/163052989</link><guid>https://blog.youkuaiyun.com/HugMua/article/details/163052989</guid><author>HugMua</author><pubDate>Mon, 20 Jul 2026 18:49:27 +0800</pubDate><description><![CDATA[​。​。]]></description><category></category></item><item><title><![CDATA[Adnroid Studio - Gradle]]></title><link>https://blog.youkuaiyun.com/HugMua/article/details/162373617</link><guid>https://blog.youkuaiyun.com/HugMua/article/details/162373617</guid><author>HugMua</author><pubDate>Sun, 28 Jun 2026 00:21:42 +0800</pubDate><description><![CDATA[Gradle 的工作由一个或多个任务（Task）来定义，任务代表构建执行的独立工作单元，比如编译一些类、创建 jar 包、生成 JavaDoc 文档、将一些内容发布到代码仓库。这些任务由插件提供（最直观的感受就是那些用来配置的DSL语句，以及build后显示的各种Task信息），工程中引入插件后就可以执行对应的任务了。当然也可以在 build.gradle 中创建自定义任务。通过继承 DefaultTask 类来创建自定义任务类型，自定义的这个类必须可继承（要么open要么abstract）。// 自定义。]]></description><category></category></item><item><title><![CDATA[Compose 组件 - 页面提示 TooltipsBox ]]></title><link>https://blog.youkuaiyun.com/HugMua/article/details/162016870</link><guid>https://blog.youkuaiyun.com/HugMua/article/details/162016870</guid><author>HugMua</author><pubDate>Tue, 16 Jun 2026 01:46:47 +0800</pubDate><description><![CDATA[Column() {},),Box() { Text("提示内容") }) {Button() { Text("显示提示") }Button() { Text("关闭提示") }]]></description><category></category></item><item><title><![CDATA[Compose 调用 - 液态玻璃 Backdrop]]></title><link>https://blog.youkuaiyun.com/HugMua/article/details/161437071</link><guid>https://blog.youkuaiyun.com/HugMua/article/details/161437071</guid><author>HugMua</author><pubDate>Wed, 27 May 2026 04:53:03 +0800</pubDate><description><![CDATA[onDrawBackdrop: DrawScope.(drawBackdrop: DrawScope.() -> Unit) -> Unit = DefaultOnDrawBackdrop,        //在背景来源层额外绘制。effects: BackdropEffectScope.() -> Unit,        //玻璃效果。shape: () -> Shape,        //形状。//边缘折射加强，默认关。]]></description><category></category></item><item><title><![CDATA[Compose 修饰符 - 样式 Style API（状态动画篇）]]></title><link>https://blog.youkuaiyun.com/HugMua/article/details/161000703</link><guid>https://blog.youkuaiyun.com/HugMua/article/details/161000703</guid><author>HugMua</author><pubDate>Thu, 14 May 2026 03:35:28 +0800</pubDate><description><![CDATA[通过交互源 InteractionSource 来更新 StyleState。构造根据交互源创建样式状态。是否按下是否悬停是否聚焦是否启用是否选择开关状态值分别为：开 On、关 Off、无法确定 Indeterminate。是否为开是否为 ToggleableState.On。创建、记忆并更新一个 StyleState。底层就是对 remember() + 构造函数 方式创建的包装，相比之下更适用于有函数参数更新样式状态时，如 enable 属性。]]></description><category></category></item><item><title><![CDATA[Compose 修饰符 - 样式 Style API（属性篇）]]></title><link>https://blog.youkuaiyun.com/HugMua/article/details/160962215</link><guid>https://blog.youkuaiyun.com/HugMua/article/details/160962215</guid><author>HugMua</author><pubDate>Mon, 11 May 2026 03:52:18 +0800</pubDate><description><![CDATA[会与其他属性结合使用。clip 和 border 使用此定义的形状。也用于图标样式设置。]]></description><category></category></item><item><title><![CDATA[Compose 修饰符 - 样式 Style API（概念篇）]]></title><link>https://blog.youkuaiyun.com/HugMua/article/details/160964714</link><guid>https://blog.youkuaiyun.com/HugMua/article/details/160964714</guid><author>HugMua</author><pubDate>Mon, 11 May 2026 03:50:56 +0800</pubDate><description><![CDATA[对 StyleScope 使用扩展属性来创建自定义效果。实验性API 暂时只支持整合已有的属性 20260511。// 定义// 使用fun Demo() { }如果 Style 对象在主题级别上存在根本差异，可以替换整个 Style 对象。例如，如果要创建一个应用，该应用针对每个产品/页面或产品/服务提供不同的主题，并且 Style 的许多属性都不同，那么在主题级别上替换整套 Style 是可以接受的。]]></description><category></category></item><item><title><![CDATA[Compose 适配 - 通过 UiMediaScope 获取设备信息]]></title><link>https://blog.youkuaiyun.com/HugMua/article/details/160961248</link><guid>https://blog.youkuaiyun.com/HugMua/article/details/160961248</guid><author>HugMua</author><pubDate>Sun, 10 May 2026 22:49:42 +0800</pubDate><description><![CDATA[设备信息是动态更新的，需要对其进行监控，并在发生任何更新时触发重组。mediaQuery() 和 derivedMediaQuery() 函数抽象了信息检索的细节，让你可以专注于定义触发布局更新的条件。UiMediaScope 代表了当前的设备能力和上下文环境，当发生变化时此对象会动态更新，查询函数会使用更新后的 UiMediaScope 对象对 Lambda 进行求值。近距离：大多数个人设备的默认设置，手机、平板、笔记本、显示器。同时存在多个输入设备会返回精度最高的。稍远：车载设备、底座模式的平板。]]></description><category></category></item><item><title><![CDATA[Compose 组件 - 流式布局 FlowLayout（FlowColumn、FlowRow）]]></title><link>https://blog.youkuaiyun.com/HugMua/article/details/160960162</link><guid>https://blog.youkuaiyun.com/HugMua/article/details/160960162</guid><author>HugMua</author><pubDate>Sun, 10 May 2026 20:34:45 +0800</pubDate><description><![CDATA[流式布局能实时响应屏幕可用空间进行重排界面，当一行（或一列）放不下里面的内容时会自动换行，还允许元素使用权重（Modifier.weight）进行动态调整大小，以将项目分配到容器中。maxItemsInEachColumn: Int = Int.MAX_VALUE,        //单列元素数量maxLines: Int = Int.MAX_VALUE,        //列数。]]></description><category></category></item><item><title><![CDATA[Compose 重组优化 - 参数稳定性（跳过不必要重组）]]></title><link>https://blog.youkuaiyun.com/HugMua/article/details/160901560</link><guid>https://blog.youkuaiyun.com/HugMua/article/details/160901560</guid><author>HugMua</author><pubDate>Sat, 09 May 2026 00:54:42 +0800</pubDate><description><![CDATA[这个值的变化可被 Compose 观察，不会在 Compose 不知道的情况下变化。不可变：对于类型 T 的两个实例 a 和 b，如果 a.equals.(b) 的结果是长期不变的，那么 T 是一个稳定类型。因此不可变类型（Immutable）也是稳定型。变化可被观察：如果类型 T 存在 public 的 var 属性（能被外部访问并更改值），且所有 public 属性的变化都能被感知并正确反映到 Compositioin，即属性的类型是 MutableState 的，那么 T 是一个稳定类型。]]></description><category></category></item><item><title><![CDATA[Compose 组件 - 弹性布局 FlexBox]]></title><link>https://blog.youkuaiyun.com/HugMua/article/details/160085133</link><guid>https://blog.youkuaiyun.com/HugMua/article/details/160085133</guid><author>HugMua</author><pubDate>Sun, 12 Apr 2026 17:34:36 +0800</pubDate><description><![CDATA[设计理念源自 Web 领域的 CSS Flexbox 模型，并且在概念、术语和行为方面几乎完全相同。]]></description><category></category></item><item><title><![CDATA[Compose 组件 - 网格布局 Grid]]></title><link>https://blog.youkuaiyun.com/HugMua/article/details/160059608</link><guid>https://blog.youkuaiyun.com/HugMua/article/details/160059608</guid><author>HugMua</author><pubDate>Sun, 12 Apr 2026 04:31:28 +0800</pubDate><description><![CDATA[有几个 column() 就有几列，按顺序定义不同列的宽度，row() 同理。两者调用顺序没有规定可以交替写，但影响可读性且无意义。默认是一行一行按列填充单元格。若 content 中的子元素数量不够填充，未被填充的单元格依旧占位。若 content 中的子元素数量超出，会新增行，由于这行没有被指定，单元格高度为该行最高的，由于所有列都是已经被指定过的，子元素的宽度超出不了。column()添加一列，并指定列宽。固定大小。百分比（Grid的总可用空间），取值范围 0 ~ 1F。]]></description><category></category></item><item><title><![CDATA[Compose 重组优化 - 状态读取（缩小重组作用域）]]></title><link>https://blog.youkuaiyun.com/HugMua/article/details/158929378</link><guid>https://blog.youkuaiyun.com/HugMua/article/details/158929378</guid><author>HugMua</author><pubDate>Thu, 12 Mar 2026 03:08:56 +0800</pubDate><description><![CDATA[原因：调用 forEach() 遍历时，生成4个 Item（子组合项）并依次设置 Element（列表元素），LaunchEffect() 也就输出了4次，但是由于 Item 和 Element 没有一一对应，当列表头部新插入一个 Element 时，会把新 Element 设置到第一个 Item 上，其余 Element 依次设置到后面的 Item 上，最后一个 Element 设置到新生成的 Item 上，因此前四个 Item 发生了重组而最后一个是新增的就不存在重组了。这几乎是 0 CPU 开销。]]></description><category></category></item></channel></rss>