Вие правите чудесна съставима функция. Има сложен потребителски интерфейс с привлекателни анимации и много място за персонализиране. Прекарвате часове в тази функция, опитвайки се да я направите перфектна. Но о, има твърде много параметри за персонализиране.
@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 и да извикват функциите с наименувани параметри, някои не биха искали списъкът им с параметри да бъде претрупан и биха искали да намерят алтернатива. Нещо подобно на това как работят Modifier
s.
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.