You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Compose Widget中Text不支持scaledSp,如何锁定文本大小避免崩溃?

解决Compose Widget中文本大小锁定及LocalDensity崩溃问题

崩溃原因

App Widget的Compose渲染环境运行在Worker线程中,未初始化完整的CompositionLocal上下文,直接调用LocalDensity.current会触发CompositionLocal LocalDensity not present异常。

解决方案

避开依赖CompositionLocal的方式,直接通过Context获取系统字体缩放比例,计算出不受系统设置影响的固定文本大小:

  1. 编写非Composable扩展函数
import android.content.Context
import androidx.compose.ui.unit.TextUnit
import androidx.compose.ui.unit.sp

fun Int.fixedSp(context: Context): TextUnit {
    // 获取系统当前的字体缩放比例
    val fontScale = context.resources.configuration.fontScale
    // 计算不受缩放影响的文本大小
    return (this / fontScale).sp
}
  1. 在Widget的Compose代码中使用
    在Widget的内容渲染逻辑里,传入Widget的Context调用该函数:
import androidx.glance.GlanceModifier
import androidx.glance.appwidget.GlanceAppWidget
import androidx.glance.text.Text
import androidx.glance.text.TextStyle
import androidx.glance.LocalContext

class MyWidget : GlanceAppWidget() {
    override fun Content() {
        val context = LocalContext.current
        Text(
            text = "固定大小的文本",
            style = TextStyle(
                fontSize = 16.fixedSp(context)
            )
        )
    }
}

原理说明

通过context.resources.configuration.fontScale直接获取系统设置的字体缩放比例,将目标sp值除以该比例,得到的文本大小会抵消系统缩放的影响,保持固定显示尺寸,同时避免了对CompositionLocal的依赖,适配Widget的运行环境。

内容的提问来源于stack exchange,提问作者Ashutosh Soni

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.18 18:54:52