标签: android-jetpack-compose-scaffold

Scaffold 中 PaddingValues 参数的用途是什么

@Composable
fun LayoutsCodelab() {
    Scaffold(
        topBar = {
            TopAppBar(
                title = {
                    Text(text = "LayoutsCodelab")
                }
            )
        }
    ) { innerPadding ->
        BodyContent(Modifier.padding(innerPadding))
    }
}
Run Code Online (Sandbox Code Playgroud)

删除innerPadding不会改变任何东西。 请注意,我是Compose

新手。 如果有任何困惑,请在评论中询问

android android-jetpack-compose android-jetpack-compose-scaffold

45
推荐指数
1
解决办法
2万
查看次数

使用 Compose Navigation 导航时 TopAppBar 闪烁

我有 2 个屏幕,它们都有自己的ScaffoldTopAppBar。当我使用 Jetpack Navigation Compose 库在它们之间导航时,应用程序栏会闪烁。为什么会发生这种情况以及我该如何摆脱这种情况?

在此输入图像描述

代码:

导航:

@Composable
fun TodoNavHost(
    navController: NavHostController,
    modifier: Modifier = Modifier
) {
    NavHost(
        navController = navController,
        startDestination = TodoScreen.TodoList.name,
        modifier = modifier
    ) {
        composable(TodoScreen.TodoList.name) {
            TodoListScreen(
                onTodoEditClicked = { todo ->
                    navController.navigate("${TodoScreen.AddEditTodo.name}?todoId=${todo.id}")
                },
                onFabAddNewTodoClicked = {
                    navController.navigate(TodoScreen.AddEditTodo.name)
                }
            )
        }
        composable(
            "${TodoScreen.AddEditTodo.name}?todoId={todoId}", 
            arguments = listOf(
                navArgument("todoId") {
                    type = NavType.LongType
                    defaultValue = -1L
                }
            )
        ) {
            AddEditTodoScreen(
                onNavigateUp = {
                    navController.popBackStack() 
                },
                onNavigateBackWithResult = { result …
Run Code Online (Sandbox Code Playgroud)

android android-jetpack android-jetpack-navigation android-jetpack-compose android-jetpack-compose-scaffold

19
推荐指数
3
解决办法
4777
查看次数

对 BottomBar 的可见性进行动画处理会导致 Jetpack Compose 中的 ui 发生“跳跃”

我正在使用 jetpack compose 编写一个 android 应用程序。

这个应用程序有一个底部栏,我有时想使用动画隐藏它。然而,这证明是具有挑战性的:当我处理可滚动屏幕时,我的用户界面出现了一些“跳跃” - 请参阅帖子末尾。

我的最小示例如下所示:

@Preview
@Composable
fun JumpingBottomBarScreen() {
    var bottomBarVisible by remember { mutableStateOf(false) }

    Scaffold(
        content = { padding ->
            Column(
                modifier = Modifier
                    .verticalScroll(rememberScrollState())
                    .fillMaxWidth()
                    .background(Color.LightGray)
                    .padding(padding)
            ) {
                (1..20).forEach { Text(text = "Test #$it of 50") }

                Button(
                    onClick = { bottomBarVisible = !bottomBarVisible },
                    content = { Text(if (bottomBarVisible) "Hide Bottom Bar" else "Show Bottom Bar") }
                )

                (21..50).forEach { Text(text = "Test #$it of 50") }
            }
        }, …
Run Code Online (Sandbox Code Playgroud)

android android-jetpack-compose android-jetpack-compose-scaffold

14
推荐指数
1
解决办法
3034
查看次数

Android Jetpack Compose(可组合)从协程获取字符串资源

我有一个封装密封类的 Flow,用于向 UI 调用消息。例如显示 Snackbar。我可以使用 LaunchedEffect 观察可组合项的流程。但问题是我想从协程范围中检索字符串资源。我不想在视图模型中使用直接字符串值,因为我想使用不同语言的区域设置,所以我传递了字符串 Res Id。那么有没有一种好的方法可以做到这一点,而无需将字符串资源放入 Application 类中并从那里检索它们,如此处所示getString Outside of a Context or Activity

代码如下:

  1. 我有用于显示小吃栏的脚手架,当用户单击填充整个屏幕的脚手架时,将调用 showSnackbarWithScope 方法,该方法向流发出新值。
  2. 然后通过 LaunchedEffect 捕获更改
  3. 然后它使用消息调用 showSnackbar() 方法,但该函数需要 String 并且我有 String Res Id (Int) 值
  4. 问题是我无法使用 stringResource() 方法从可组合范围中检索字符串,因为我位于协程中
@Composable
fun HomeScreen(viewModel: CityWeatherViewModel) {
 
    val scaffoldState = rememberScaffoldState() 
    LaunchedEffect(true) {
        viewModel.eventFlow.collectLatest { event ->
            when (event) {
                is CityWeatherViewModel.UIEvent.ShowSnackbar -> {
                    
                    // THE PROBLEM IS HERE!!!, since event.messageResId is res id, and not the string resource, and I can not use …
Run Code Online (Sandbox Code Playgroud)

android kotlin android-jetpack-compose android-jetpack-compose-scaffold

10
推荐指数
1
解决办法
8115
查看次数

Jetpack Compose 导航:从具有相同路线(参数除外)的屏幕弹出到屏幕

导航撰写版本2.4.0-alpha06

我有一个导航抽屉Scaffold,其中部分项目是由 ViewModel 动态生成的。

示例项目有

  • A
  • C ...
  • 设置

其中 A、B、C... 都共享相同的Screencalled Category,只是传递了不同的参数(例如 Category/A、Category/B)。

在我的里面Scaffold

...

val items = viewModel.getDrawerItems()
// This gives something like 
// ["Home", "Category/A", "Category/B", "Category/C", ..., "Settings"] 
// where each String represents "route"

...

val backstackEntry = navController.currentBackStackEntryAsState()
val currentScreen = Screen.fromRoute(
    backstackEntry.value?.destination?.route
)
Log.d("Drawer", "currentScreen: $currentScreen")

items.forEach { item ->
    DrawerItem(
        item = item, 
        isSelected = currentScreen.name == item.route, 
        onItemClick = {
            Log.d("Drawer", "destinationRoute: ${item.route}") …
Run Code Online (Sandbox Code Playgroud)

android kotlin android-jetpack-navigation android-jetpack-compose android-jetpack-compose-scaffold

8
推荐指数
2
解决办法
2万
查看次数

java.lang.NoSuchFieldError: 没有 Landroidx/compose/foundation/layout/BoxScope$Companion 类型的字段 Companion;

我是第一次使用 Jetpack Compose,但出现此错误。我还没有弄清楚问题到底出在哪里,但我使用的是单一活动架构。如果需要更多信息,请通知我。根据错误,问题似乎来自 Scaffold。

                val scaffoldState = rememberScaffoldState()

                Scaffold(
                    scaffoldState = scaffoldState,
                    snackbarHost = {
                        SnackbarHost(hostState = it)
                    }
                ) {
Run Code Online (Sandbox Code Playgroud)
java.lang.NoSuchFieldError: No field Companion of type Landroidx/compose/foundation/layout/BoxScope$Companion; in class Landroidx/compose/foundation/layout/BoxScope; or its superclasses (declaration of 'androidx.compose.foundation.layout.BoxScope' appears in /data/app/com.octagon_technologies.scafe-0B8-dDpbnRqa6fydxFPekw==/base.apk)
        at androidx.compose.material.SurfaceKt$Surface$1.invoke(Surface.kt:149)
        at androidx.compose.material.SurfaceKt$Surface$1.invoke(Surface.kt:105)
        at androidx.compose.runtime.internal.ComposableLambdaImpl.invoke(ComposableLambda.jvm.kt:109)
        at androidx.compose.runtime.internal.ComposableLambdaImpl.invoke(ComposableLambda.jvm.kt:34)
        at androidx.compose.runtime.CompositionLocalKt.CompositionLocalProvider(CompositionLocal.kt:193)
        at androidx.compose.material.SurfaceKt.Surface-F-jzlyU(Surface.kt:102)
        at androidx.compose.material.ScaffoldKt$Scaffold$child$1.invoke(Scaffold.kt:168)
        at androidx.compose.material.ScaffoldKt$Scaffold$child$1.invoke(Scaffold.kt:167)
        at androidx.compose.runtime.internal.ComposableLambdaImpl.invoke(ComposableLambda.jvm.kt:118)
        at androidx.compose.runtime.internal.ComposableLambdaImpl.invoke(ComposableLambda.jvm.kt:34)
        at androidx.compose.material.ScaffoldKt.Scaffold-J67Y1T8(Scaffold.kt:197)
        at com.octagon_technologies.scafe.presentation.MainActivity$onCreate$1$1.invoke(MainActivity.kt:54)
        at com.octagon_technologies.scafe.presentation.MainActivity$onCreate$1$1.invoke(MainActivity.kt:47)
        at androidx.compose.runtime.internal.ComposableLambdaImpl.invoke(ComposableLambda.jvm.kt:109)
        at androidx.compose.runtime.internal.ComposableLambdaImpl.invoke(ComposableLambda.jvm.kt:34)
        at androidx.compose.runtime.CompositionLocalKt.CompositionLocalProvider(CompositionLocal.kt:193)
        at androidx.compose.material.TextKt.ProvideTextStyle(Text.kt:246)
        at androidx.compose.material.MaterialThemeKt$MaterialTheme$1.invoke(MaterialTheme.kt:78)
        at androidx.compose.material.MaterialThemeKt$MaterialTheme$1.invoke(MaterialTheme.kt:77)
        at androidx.compose.runtime.internal.ComposableLambdaImpl.invoke(ComposableLambda.jvm.kt:109) …
Run Code Online (Sandbox Code Playgroud)

android kotlin android-jetpack-compose android-jetpack-compose-scaffold

7
推荐指数
2
解决办法
1454
查看次数

如何更改支架浮动操作按钮在不同屏幕上的操作。Jetpack 组合

如何根据 Scaffold 的当前屏幕更改 FAB 操作(onClick{})。

            Scaffold(
                floatingActionButton = {
                    FloatingActionButton(onClick = { 
                        //Different actions here depending on current screen
                    }) { }
                }
            ) {
                NavHost(
                    navController = navController,
                    startDestination = "route1"
                ) {
                    composable(
                        route = "route1"
                    ) {
                        ScreenOne()
                    }

                    composable(
                        route = "route2"
                    ) {
                        ScreenTwo()
                    }
                }
            }
Run Code Online (Sandbox Code Playgroud)

例如,使用 ScreenOne() 我想向数据库添加一些实体,使用 ScreenTwo() 我想保存编辑后的实体。所有这些都使用 Scaffold 共享的相同 FAB。

更新:刚刚明白我还需要提到我还需要 FAB 来了解一些数据来操作。例如,我想通过单击 FAB 将一些实体保存到数据库,因此 FAB 需要了解该实体。

示例:我单击列表中的某个项目。它打开一些实体的导航方向。我正在修改此实体并单击 FAB 来保存编辑后的实体。

android android-jetpack-compose android-jetpack-compose-scaffold

6
推荐指数
1
解决办法
1945
查看次数

Jetpack 撰写底部应用栏深色

我试图将导航栏设置为与底部应用程序栏相同的颜色,但我不明白应用程序栏的颜色来自深色主题。看起来应该是这样MaterialTheme.colors.primarySurface,但我使用的systemUiController.setNavigationBarColor(color = MaterialTheme.colors.primarySurface)颜色与应用栏不同。此处您将看到两个都设置为 时的示例MaterialTheme.colors.primarySurface

在此输入图像描述

它适用于浅色主题,但不适用于深色主题。

那么深色主题应用栏颜色从何而来?

android android-jetpack-compose android-jetpack-compose-scaffold

6
推荐指数
1
解决办法
1443
查看次数

如何在 JetpackCompose 中设置脚手架抽屉宽度?

我们可以在 JetpackCompose 中使用导航抽屉,Scaffold如下所示

Scaffold(
    drawerContent = { Text(text ="Drawer") }
) {}
Run Code Online (Sandbox Code Playgroud)

在此处输入图片说明

我想让抽屉的宽度变小。我怎么能这样做?

android-jetpack-compose android-jetpack-compose-scaffold

5
推荐指数
2
解决办法
534
查看次数

什么是脚手架?喷气背包组合

我想知道什么是喷气背包中的 Scaffold 与一个BottomAppBar 示例 谁能帮助我 Scaffold

android android-bottomappbar android-jetpack-compose android-jetpack-compose-scaffold

5
推荐指数
1
解决办法
1561
查看次数