Jetpack compose: верхняя панель приложений закрепленаScrollBehavior не меняет цвет при прокрутке из событий фокуса текста
Итак, это немного конкретная проблема, но, надеюсь, кто-то понимает, что происходит:
Я использую Jetpack Compose Material 3.CenterAlignedTopAppBar
, сTopAppBarDefaults.pinnedScrollBehavior
чтобы сделать так, чтобы цвет панели приложений менялся, когда я прокручиваю вложенный контент.
Оно работает! В большинстве случаев. Однако на одном из моих экранов есть большое текстовое поле, при нажатии на которое контент прокручивается сам по себе (чтобы сфокусироваться на текстовом поле), и это, кажется, сбивает с толку панель приложений, которая не меняет цвет. Он изменит цвет, только если я вручную прокручиваю вверх и вниз.
Соответствующий код:
val scrollBehavior = TopAppBarDefaults.pinnedScrollBehavior(rememberTopAppBarState())
Scaffold(
contentWindowInsets = EmptyWindowInsets,
modifier = Modifier
.fillMaxHeight()
.nestedScroll(scrollBehavior.nestedScrollConnection),
topBar = {
// just a wrapper around CenterAlignTopAppBar
StandardTopAppBar(scrollBehavior = scrollBehavior)
},
content = { innerPadding ->
// I've also tried with LazyColumn and see the same behavior
Column(
Modifier
.padding(innerPadding)
.padding(start = 10.dp, end = 10.dp)
.fillMaxHeight()
.verticalScroll(rememberScrollState()),
verticalArrangement = Arrangement.spacedBy(10.dp),
) {
тл;др; ручная прокрутка изменяет цвет панели приложения, но прокрутка, вызванная нажатием на текстовое поле, которое прокручивается в поле зрения, не меняется. Есть идеи, как я могу это исправить?
1 ответ
Возможно, это не совсем то, что вы ищете, к сожалению, но у меня была похожая проблема. Мой цвет TopAppBar тоже застрял, но при переходе между разными экранами. Я исправил это, назначив TopAppBar другое поведение прокрутки в зависимости от экрана.
val scrollBehavior1 = TopAppBarDefaults.pinnedScrollBehavior(rememberTopAppBarState())
val scrollBehavior2 = TopAppBarDefaults.pinnedScrollBehavior(rememberTopAppBarState())
В аргументах TopAppBar:
scrollBehavior =
when (currentRoute) {
Screens.ExampleScreen1.route -> scrollBehavior1
Screens.ExampleScreen2.route -> scrollBehavior2
else -> null
}
Надеюсь, это поможет вам так или иначе.