#android #android-jetpack-compose
#Android #android-jetpack-compose
Вопрос:
В обычном Xml activity building существует <include>
свойство, которое позволяет повторно использовать дизайны в разных действиях, таких как верхняя и нижняя панели. Я искал что-то подобное в Jetpack Compose, но я ничего не могу найти. Я знаю, что функции @Composable работают как независимые элементы, которые можно использовать, когда вы захотите, но если бы я использовал этот подход, эти элементы перезагружались бы всякий раз, когда менялось действие.
Ответ №1:
В этом нет необходимости: просто вызовите функцию, в которой вы определили дизайн / компоновку, которую хотите использовать.
В традиционных макетах Android <include>
тег необходим, потому что в XML нет понятия «вызова» другого XML-файла. В Compose каждый макет и каждый компонент является функцией, поэтому вы можете просто вызвать функцию везде, где хотите повторно использовать этот макет.
Практически нет разницы между включением содержимого составной функции непосредственно в другую составную функцию и вызовом этой составной функции (есть небольшие различия во внутренней бухгалтерии среды выполнения, но, как правило, пользователям Compose не о чем беспокоиться).
Фактически, вы можете пометить составную функцию inline
, чтобы добиться этого более непосредственно и встроить содержимое в вызывающую функцию.
Комментарии:
1. проблема дизайна при таком подходе заключается в том, что если я просто вызываю функцию @Composable, например, нижнюю панель, при каждом действии, где мне это нужно, панель будет перезагружаться каждый раз, и я просто хочу перезагрузить остальной контент, будет похоже на наличие слоя пользовательского интерфейса «поверх» остальной части приложения.
2. Это также верно для
<include>
: он будет повторно раздуваться в каждом макете, в котором он используется.3. @IgnacioMiranda: «панель будет перезагружаться каждый раз, и я просто хочу перезагрузить остальное содержимое» — это не то, как работает Compose. Compose — это декларативная система пользовательского интерфейса. В принципе, все «перезагружается каждый раз», и среда выполнения Compose определяет, как изменить то, что отображается, чтобы соответствовать результату перекомпозиции.
4. @CommonsWare итак, невозможно реализовать что-то вроде xml-фрагментов, но написанных в Compose?
5. @IgnacioMiranda: Да, вы можете. Райан объяснил это в своем ответе. Вы просто думаете, что «эти элементы будут перезагружаться всякий раз, когда изменится действие» — это проблема, но это не так. Compose с помощью
remember
и связанных свойств может определять, какие составные элементы необходимо переоценить на основе изменений состояния. И Compose может определить, что это означает с точки зрения рендеринга пользовательского интерфейса. Как правило, мы перестаем беспокоиться о том, что «эти элементы будут перезагружаться при изменении действия», и просто описываем нужный нам пользовательский интерфейс, используя составные функции.