Compose Widget中Text不支持scaledSp,如何锁定文本大小避免崩溃?
解决Compose Widget中文本大小锁定及LocalDensity崩溃问题
崩溃原因
App Widget的Compose渲染环境运行在Worker线程中,未初始化完整的CompositionLocal上下文,直接调用LocalDensity.current会触发CompositionLocal LocalDensity not present异常。
解决方案
避开依赖CompositionLocal的方式,直接通过Context获取系统字体缩放比例,计算出不受系统设置影响的固定文本大小:
- 编写非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 }
- 在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
相关产品推荐
相关产品推荐

