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
    }

Надеюсь, это поможет вам так или иначе.

Другие вопросы по тегам