Существует ли эквивалент для повторного использования дизайнов / макетов в Jetpack Compose?

#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 может определить, что это означает с точки зрения рендеринга пользовательского интерфейса. Как правило, мы перестаем беспокоиться о том, что «эти элементы будут перезагружаться при изменении действия», и просто описываем нужный нам пользовательский интерфейс, используя составные функции.