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

从Flutter转Compose开发遇Scaffold实验性API报错求助

Jetpack Compose Scaffold与应用栏适配问题解决方案

一、实验性API报错的解决

你遇到的This material API is experimental and is likely to change or to be removed in the future错误,是因为当前Compose版本中Material 2的Scaffold和TopAppBar被标记为实验性API。有两种处理方式:

1. 保留Material 2并允许使用实验性API

  • 在调用这些API的Composable函数上添加@OptIn(ExperimentalMaterialApi::class)注解
  • 或者在模块的build.gradle.kts(或build.gradle)中全局配置编译参数,避免每个函数都加注解:
android {
    kotlinOptions {
        freeCompilerArgs += "-opt-in=androidx.compose.material.ExperimentalMaterialApi"
    }
}

修改后的代码示例:

import androidx.compose.material.ExperimentalMaterialApi
import androidx.compose.material.Scaffold
import androidx.compose.material.TopAppBar
import androidx.compose.material.Text
import androidx.compose.ui.Modifier

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

@OptIn(ExperimentalMaterialApi::class)
@Composable
fun MainScreen() {
    Scaffold(
        topBar = {
            TopAppBar {
                Text(text = "My todo app")
            }
        }
    ) { paddingValues ->
        // 必须使用paddingValues避免内容被顶部栏遮挡
        Text(text = "Hello, world!", modifier = Modifier.padding(paddingValues))
    }
}

2. 迁移到Material 3(推荐方案)

既然你明确想使用Material 3的应用栏,直接切换到Material 3的稳定组件即可,完全不会有实验性API的问题:

步骤1:确认Material 3依赖

在模块的build.gradle.kts中添加Material 3依赖(使用最新稳定版本):

dependencies {
    implementation("androidx.compose.material3:material3:1.1.2")
}

步骤2:替换为Material 3组件

Material 3提供了不同尺寸的应用栏组件(SmallTopAppBar、MediumTopAppBar、LargeTopAppBar),最常用的是SmallTopAppBar,对应你需求的基础顶部栏:

import androidx.compose.material3.Scaffold
import androidx.compose.material3.SmallTopAppBar
import androidx.compose.material3.Text
import androidx.compose.ui.Modifier

class MainActivity : ComponentActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContent {
            // 确保主题是Material 3主题,若原主题是Material 2需同步修改
            SimpleTodoApkaTheme {
                MainScreen()
            }
        }
    }
}

@Composable
fun MainScreen() {
    Scaffold(
        topBar = {
            SmallTopAppBar(
                title = { Text(text = "My todo app") }
            )
        }
    ) { paddingValues ->
        Text(text = "Hello, world!", modifier = Modifier.padding(paddingValues))
    }
}

步骤3:同步Material 3主题

如果你的SimpleTodoApkaTheme还是Material 2主题,需要切换为Material 3主题,示例:

import androidx.compose.material3.MaterialTheme
import androidx.compose.material3.darkColorScheme
import androidx.compose.material3.lightColorScheme
import androidx.compose.runtime.Composable
import androidx.compose.ui.platform.LocalContext
import android.os.Build
import androidx.compose.material3.dynamicDarkColorScheme
import androidx.compose.material3.dynamicLightColorScheme
import androidx.compose.foundation.isSystemInDarkTheme

private val DarkColorScheme = darkColorScheme(
    primary = Color(0xFFBB86FC),
    secondary = Color(0xFF03DAC6)
)

private val LightColorScheme = lightColorScheme(
    primary = Color(0xFF6200EE),
    secondary = Color(0xFF03DAC6)
)

@Composable
fun SimpleTodoApkaTheme(
    darkTheme: Boolean = isSystemInDarkTheme(),
    dynamicColor: Boolean = true,
    content: @Composable () -> Unit
) {
    val colorScheme = when {
        dynamicColor && Build.VERSION.SDK_INT >= Build.VERSION_CODES.S -> {
            val context = LocalContext.current
            if (darkTheme) dynamicDarkColorScheme(context) else dynamicLightColorScheme(context)
        }
        darkTheme -> DarkColorScheme
        else -> LightColorScheme
    }

    MaterialTheme(
        colorScheme = colorScheme,
        typography = Typography,
        content = content
    )
}

重要提示

  • Material 2和Material 3的组件不能混用,比如不能用material3的Scaffold搭配material2的TopAppBar
  • 务必使用Scaffold返回的paddingValues给内容添加内边距,这和Flutter中Scaffold的body需要处理内边距的逻辑一致
  • Material 3的设计更贴合Material You规范,和Flutter的Material 3组件逻辑对齐,后续开发体验会更接近你熟悉的Flutter环境

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.23 02:00:41