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

Android Compose中Scaffold内Text初始显示异常问题求助

问题描述

在小米Pocophone F1(Android 10.0,API 29)设备调试时,使用Compose Material3的Scaffold组件出现以下异常:

  • 应用初始启动时,Scaffold内的Text组件显示为白色(几乎不可见)
  • 旋转手机后文本恢复正常黑色
  • 跳转至第二个Activity再返回后文本也正常,但第三次往返后问题复现且无法恢复
  • 怀疑与ExperimentalMaterial3Api有关,但不确定

复现代码

package com.test.pricejournal

import android.app.Activity
import android.content.Intent
import android.os.Bundle
import androidx.activity.ComponentActivity
import androidx.activity.compose.setContent
import androidx.activity.enableEdgeToEdge
import androidx.compose.foundation.layout.Arrangement
import androidx.compose.foundation.layout.Column
import androidx.compose.foundation.layout.padding
import androidx.compose.material.icons.Icons
import androidx.compose.material3.CenterAlignedTopAppBar
import androidx.compose.material3.ExperimentalMaterial3Api
import androidx.compose.material3.MaterialTheme
import androidx.compose.material3.OutlinedButton
import androidx.compose.material3.Scaffold
import androidx.compose.material3.Text
import androidx.compose.material3.TopAppBarDefaults
import androidx.compose.material3.rememberTopAppBarState
import androidx.compose.runtime.Composable
import androidx.compose.ui.Modifier
import androidx.compose.ui.graphics.Color
import androidx.compose.ui.input.nestedscroll.nestedScroll
import androidx.compose.ui.text.style.TextOverflow
import androidx.compose.ui.tooling.preview.Preview
import androidx.compose.ui.unit.dp
import com.test.pricejournal.ui.theme.PriceJournalTheme

class MainActivity : ComponentActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        enableEdgeToEdge()
        setContent {
            MainUI()
        }
    }

    private fun navigateToSecondActivity() {
        val intent = Intent(this, AddShopActivity::class.java)
        startActivity(intent)
    }

    @OptIn(ExperimentalMaterial3Api::class)
    @Composable
    fun MainUI() {
        val scrollBehavior = TopAppBarDefaults.pinnedScrollBehavior(rememberTopAppBarState())

        Scaffold(
            modifier = Modifier.nestedScroll(scrollBehavior.nestedScrollConnection),
            topBar = {
                CenterAlignedTopAppBar(
                    colors = TopAppBarDefaults.topAppBarColors(
                        containerColor = MaterialTheme.colorScheme.primaryContainer,
                        titleContentColor = MaterialTheme.colorScheme.primary,
                    ),
                    title = {
                        Text(
                            "Price Journal",
                            maxLines = 1,
                            overflow = TextOverflow.Ellipsis
                        )
                    },
                    scrollBehavior = scrollBehavior,
                )
            },
        ) { innerPadding ->
            Column(
                modifier = Modifier.padding(innerPadding),
                verticalArrangement = Arrangement.spacedBy(16.dp),
            ) {
                Text(
                    color = Color.Black,
                    modifier = Modifier.padding(8.dp),
                    text =
                    """
                    This is an example of a scaffold. It uses the Scaffold composable's parameters to create a screen with a simple top app bar, bottom app bar, and floating action button.

                    It also contains some basic inner content, such as this text.
                """.trimIndent()
                )
                OutlinedButton(
                    onClick = { navigateToSecondActivity() },
                    modifier = Modifier.padding(8.dp)
                ) {
                    Text("Add Shop")
                }
            }
        }
    }

    @Preview(showBackground = true)
    @Composable
    fun DefaultPreview() {
        MainUI()
    }
}
解决方案

1. 替换硬编码颜色为主题适配色

硬设置Color.Black会忽略主题的颜色适配逻辑,当系统或主题的背景色发生变化时,可能出现文本与背景色对比度极低的情况。改用Material3主题提供的onSurface颜色,会自动根据当前背景色选择合适的文本对比色:

Text(
    color = MaterialTheme.colorScheme.onSurface, // 替换Color.Black
    modifier = Modifier.padding(8.dp),
    text = """
        This is an example of a scaffold. It uses the Scaffold composable's parameters to create a screen with a simple top app bar, bottom app bar, and floating action button.

        It also contains some basic inner content, such as this text.
    """.trimIndent()
)

2. 确保主题完整应用

原代码中MainUI未包裹在PriceJournalTheme内部,导致MaterialTheme.colorScheme的上下文可能不完整。修改setContent部分:

setContent {
    PriceJournalTheme {
        MainUI()
    }
}

3. 升级Material3到稳定版

早期ExperimentalMaterial3Api标记的组件存在状态恢复类bug,升级到稳定版后(如material3:1.1.0及以上),CenterAlignedTopAppBar、Scaffold等组件已脱离实验状态,可避免生命周期交互时的异常。

4. 优化ScrollBehavior的状态管理

将scrollBehavior的创建包裹在remember中,确保配置变化和Activity重建时状态正确恢复:

val scrollBehavior = remember {
    TopAppBarDefaults.pinnedScrollBehavior(rememberTopAppBarState())
}

应用以上修改后,重新测试启动、屏幕旋转、多次Activity往返场景,即可解决文本颜色异常问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.23 03:35:03