Jetpack compose AppBarIcon жалуется, что «функции, которые вызывают функции @Composable, должны быть помечены как @Composable» - PullRequest
0 голосов
/ 19 января 2020

Я использовал jetpack compose элемент AppBarIcon, но получил ошибку: функции, которые вызывают функции @Composable, должны быть помечены @Composable ", когда я вызываю компонуемую функцию на lamba onclick. Это код:

class testActivity : AppCompatActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)

        setContent { AppBarIcon(Image(10, 10) ) {
                composableFunction()
            }
        }
    }
} 

@Composable()
fun composableFunction() {
}

и это реальная проблема, потому что я получил исключение во время выполнения

Это что-то, по чему я скучаю или это реальная ошибка?

1 Ответ

0 голосов
/ 19 января 2020

Прежде всего обратите внимание, что Composable function must только be called inside another Composable function.
Теперь вернемся к вашему вопросу, параметр onClick, который принимает функцию, не является составной функцией. Поэтому вызывать функцию @Composable внутри onClick не вариант, и, следовательно, выдается ошибка Functions which invoke @Composable functions must be marked with the @Composable.
Код для решения этой проблемы.

class testActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)

    setContent {
        var loadView = +state { false }
        Column {
            AppBarIcon(+imageResource(R.drawable.dashboard)) {
                loadView.value = true
            }
            Text("Hey")
            if (loadView.value)
                composableFunction()
        }
    }
  }
}
@Composable()
fun composableFunction() {
    Text("appbar content")
}

Причина, так как onClick не может быть скомпонован: Все функции Composable вызываются одновременно для полного создания пользовательского интерфейса. Когда onClick вызывается позже после того, как пользовательский интерфейс уже составлен. Поэтому вам нужно использовать состояние, чтобы перекомпоновывать пользовательский интерфейс и загружать компонуемую функцию после появления onClick.

...