Вие правите чудесна съставима функция. Има сложен потребителски интерфейс с привлекателни анимации и много място за персонализиране. Прекарвате часове в тази функция, опитвайки се да я направите перфектна. Но о, има твърде много параметри за персонализиране.

@Composable
fun MyFancyComponent(
  value: Int,
  onValueChanged: (Int) -> Unit,
  modifier: Modifier = Modifier,
  primaryColor: Color = Color.Black,
  accentColor: Color = Color.Red,
  itemSpacing: Dp = 8.dp,
  componentStyle: ComponentStyle = ComponentStyle.Normal,
  // [...]
) {/* ... */}

Докато някои хора биха предпочели да използват този подход за своите composables и да извикват функциите с наименувани параметри, някои не биха искали списъкът им с параметри да бъде претрупан и биха искали да намерят алтернатива. Нещо подобно на това как работят Modifiers.

Modifier е интерфейс, където можете да свържете свойствата, които искате вашето оформление да бъде съставено, за да се погрижи за вашия дизайн. Нека опитаме и приемем тази техника за функцията MyFancyComponent.

Във вашия проект нека създадем клас и да го наименуваме MyFancyComponentAttributes. Това ще има всички свойства, от които се нуждаете за тази композируема функция. За всяко свойство, което искате да добавите, поддържайте го публично със стойност по подразбиране и частен сетер и добавете функция със същото име като свойството.

Например създадохме класа и искаме да добавим атрибута primaryColor, можем да напишем,

class MyFancyComponentAttributes {
  var primaryColor: Color = Color.Black
    priavte set
  fun primaryColor(value: Color) = 
    apply {
      primaryColor = value
    }
  
  // [...]
}

Функцията ще приеме цвят като параметър и ще върне същия обект с модифицираното свойство. Продължете да правите това за всички имоти.

Сега променете функцията за съставяне на

/* in your composable file */
@Composable
fun MyFancyComponent(
  value: Int,
  onValueChanged: (Int) -> Unit,
  modifier: Modifier = Modifier,
  attrs: MyFancyComponentAttributes = MyFancyComponentAttributes()
) {
  // Access properties by attrs.primaryColor, etc
}

/* while calling the composable function */
MyFancyComponent(
  value = number,
  onValueChanged = { number = it},
  modifier = Modifier
    .padding(horizontal = 16.dp),
  attrs = MyFancyComponentAttributes()
    .primaryColor(Color.White)
    .accentColor(Color.Purple)
    .itemSpacing(12.dp)
)

Това е прост, но мощен метод за отделяне на необходимите атрибути от задръстване на вашата дефиниция на функция и е в съответствие с модела на Modifier, предоставен от Google.