Compose 在material3中找不到ScaffoldState类

文章讲述了Material3(M3)中Scaffold类的变化,ScaffoldState不再存在,推荐使用SnackbarHostState显示信息提示,以及如何替换M2中的Drawer参数并使用ModalNavigationDrawer。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

material3中找不到ScaffoldState

官方说 M2 ScaffoldState 类在 M3 中已不存在,因为它包含不再需要的 drawerState 参数。如需使用 M3 Scaffold 显示信息提示控件,请改用 SnackbarHostState
M2:

import androidx.compose.material.Scaffold
import androidx.compose.material.rememberScaffoldState

val scaffoldState = rememberScaffoldState()
val scope = rememberCoroutineScope()

Scaffold(
    scaffoldState = scaffoldState,
    content = {
        …
        scope.launch {
            scaffoldState.snackbarHostState.showSnackbar()
        }
    }
)

M3

import androidx.compose.material3.Scaffold
import androidx.compose.material3.SnackbarHost
import androidx.compose.material3.SnackbarHostState

val snackbarHostState = remember { SnackbarHostState() }
val scope = rememberCoroutineScope()

Scaffold(
    snackbarHost = { SnackbarHost(snackbarHostState) },
    content = {
        …
        scope.launch {
            snackbarHostState.showSnackbar()
        }
    }
)

M2 Scaffold 中的所有 drawer* 参数都已从 M3 Scaffold 中移除。其中包括 drawerShapedrawerContent 等参数。如需使用 M3 Scaffold 显示抽屉式导航栏,请改用抽屉式导航栏可组合项(如 ModalNavigationDrawer):
M2:

import androidx.compose.material.DrawerValue
import
import androidx.compose.material.Scaffold
import androidx.compose.material.rememberDrawerState
import androidx.compose.material.rememberScaffoldState

val scaffoldState = rememberScaffoldState(
    drawerState = rememberDrawerState(DrawerValue.Closed)
)
val scope = rememberCoroutineScope()

Scaffold(
    scaffoldState = scaffoldState,
    drawerContent = {},
    drawerGesturesEnabled =,
    drawerShape =,
    drawerElevation =,
    drawerBackgroundColor =,
    drawerContentColor =,
    drawerScrimColor =,
    content = {
        …
        scope.launch {
            scaffoldState.drawerState.open()
        }
    }
)

M3:

import androidx.compose.material3.DrawerValue
import androidx.compose.material3.ModalDrawerSheet
import androidx.compose.material3.ModalNavigationDrawer
import androidx.compose.material3.Scaffold
import androidx.compose.material3.rememberDrawerState

val drawerState = rememberDrawerState(DrawerValue.Closed)
val scope = rememberCoroutineScope()

ModalNavigationDrawer(
    drawerState = drawerState,
    drawerContent = {
        ModalDrawerSheet(
            drawerShape =,
            drawerTonalElevation =,
            drawerContainerColor =,
            drawerContentColor =,
            content = {}
        )
    },
    gesturesEnabled =,
    scrimColor =,
    content = {
        Scaffold(
            content = {
                …
                scope.launch {
                    drawerState.open()
                }
            }
        )
    }
)
### 如何将 `androidx.compose.material` 编译到 `android.bp` 文件中 要在 Android 的模块构建系统中将 `androidx.compose.material` 库集成到项目的 `android.bp` 配置文件中,需要遵循 AOSP 构建系统的规则并正确声明依赖项。以下是具体实现方式: #### 1. **定义模块型** 在 `android.bp` 中,通常使用 `java_library`, `android_app`, 或其他适合的模块型来描述项目结构。如果目标是一个 Java/Kotlin 库,则应选择 `java_library`。 ```plaintext java_library { name: "my-compose-module", srcs: [ "src/**/*.kt", "src/**/*.java", ], resource_dirs: ["res"], static_libs: [ "androidx.compose.material_material", // 添加 Compose Material 库 ], compile_dex: true, } ``` 上述代码片段展示了如何通过 `static_libs` 字段引入 `androidx.compose.material`[^6]。此字段用于指定静态库依赖关系。 --- #### 2. **确保正确的命名空间映射** AOSP 使用预定义的名称空间来解析外部库。对于 Jetpack Compose 组件,这些库已经被预先打包成特定的名字(如 `androidx.compose.material_material`)。因此无需额外下载 Gradle 插件或 Maven 存储库地址。 为了验证可用的库列表,请查阅 AOSP 源码树下的 `prebuilts/runtime/compiled` 路径中的 `.jar` 和 `.aar` 文件名。例如: - 如果存在名为 `androidx.compose.material_material.aar` 的文件,则可以直接引用其对应的模块名作为依赖项。 --- #### 3. **处理资源冲突** 当使用 Compose 材料设计组件时,可能会遇到资源 ID 冲突或其他兼容性问题。可以通过以下方法解决这些问题: - 明确设置主题样式为基于 Compose 的默认主题。 - 确保所有 XML 布局文件和自定义视图均支持最新的 API 版本。 示例代码展示如何在应用的主题中启用 Comose 支持: ```xml <style name="Theme.MyApp" parent="Theme.MaterialComponents.DayNight"> <!-- 启用 Jetpack Compose --> <item name="composeDestinationStyle">@style/ComposeDestination</item> </style> ``` --- #### 4. **测试与调试** 完成配置后,运行以下命令以确认编译过程无误: ```bash mmma path/to/module/ ``` 或者在整个源码树范围内触发增量构建: ```bash make my-compose-module ``` 如果一切顺利,生成的目标二进制文件将包含所需的 Compose 功能和支持材料设计样式的 UI 控件。 --- ### 注意事项 尽管可以借助 `android.bp` 将第三方库嵌入至 AOSP 工程中,但在实际开发过程中仍需关注以下几个方面: - **版本一致性**:确保所选库版本与其他依赖项保持一致,以免引发潜在的功能失效或崩溃风险。 - **性能优化**:避免不必要的大型依赖导入,从而减少最终 APK 大小以及加载时间开销。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值