Как поднять несколько состояний?

#android #android-view #android-jetpack-compose

#Android #android-просмотр #android-реактивный ранец-составить

Вопрос:

Когда мы говорим о Compose, мы обязательно столкнемся с подходом подъема состояния. Что довольно удобно и не требует знаний в области ракетостроения. Но здесь вступает в игру куча других вопросов и еще куча возможных решений. Это все о многочисленных параметрах, проходящих через объявление fun. Возвращаясь к старым добрым временам, мы могли бы позволить себе иметь контейнер, который будет содержать в основном все параметры (простой). С другой стороны, у нас могут быть параметры по умолчанию, но в любом случае это не поможет справиться с несколькими (огромным количеством) строками объявления функции. Какие-нибудь мысли здесь?

Если мы погрузимся немного глубже и рассмотрим androidx.compose.*** (т. Е. Материальный) пакет, мы найдем множество составных элементов, которые на самом деле имеют много параметров (лямбд) для подъема состояния. Поэтому я считаю, что это общий подход. Мы можем взять TextField composable, что является хорошим примером того, что я говорю:

 @Composable
fun TextField(
    value: String,
    onValueChange: (String) -> Unit,
    modifier: Modifier = Modifier,
    textStyle: TextStyle = AmbientTextStyle.current,
    label: @Composable (() -> Unit)? = null,
    placeholder: @Composable (() -> Unit)? = null,
    leadingIcon: @Composable (() -> Unit)? = null,
    trailingIcon: @Composable (() -> Unit)? = null,
    isErrorValue: Boolean = false,
    visualTransformation: VisualTransformation = VisualTransformation.None,
    keyboardType: KeyboardType = KeyboardType.Text,
    imeAction: ImeAction = ImeAction.Unspecified,
    onImeActionPerformed: (ImeAction, SoftwareKeyboardController?) -> Unit = { _, _ -> },
    onTextInputStarted: (SoftwareKeyboardController) -> Unit = {},
    interactionState: InteractionState = remember { InteractionState() },
    activeColor: Color = MaterialTheme.colors.primary,
    inactiveColor: Color = MaterialTheme.colors.onSurface,
    errorColor: Color = MaterialTheme.colors.error,
    backgroundColor: Color = MaterialTheme.colors.onSurface.copy(alpha = ContainerAlpha),
    shape: Shape =
        MaterialTheme.shapes.small.copy(bottomLeft = ZeroCornerSize, bottomRight = ZeroCornerSize)
)
  

Конечно, он также содержит множество параметров конфигурации и составных слотов.
Тем не менее, вопрос остается.
У меня есть несколько вариантов, когда такая ситуация может произойти:

  • Сложный пользовательский интерфейс, состоящий из множества возможных пользовательских событий, т. Е. TextField
  • Сложная структура / иерархия пользовательского интерфейса с несколькими составными элементами, которые обертывают друг друга и должны поднимать события / пользовательские данные снизу вверх. Ну, подъем может увеличить уровень параметров (лямбд) на каждом уровне.
  • Your case here

PS Я не говорю, что это неправильно или в этом есть что-то плохое, просто пытаюсь найти удобный способ.

P.P.S. Я знаю, что все дело в компромиссах.

Комментарии:

1. Я бы рекомендовал изучить эту тему. kotlinlang.slack.com/archives/CJLTWPH7S/p1593479419224100

Ответ №1:

Лично я думаю, что структурирование параметров в data classes может дать немного больше удобства для чтения, для бота потребителя и поставщика.

Например: activeColor , inactiveColor , errorColor , backgroundColor . Может быть перемещен в

 data class TextFieldColors(
    val activeColor: Color, 
    val inactiveColor: Color, 
    val errorColor: Color, 
    val backgroundColor: Color)
  

(Прошу прощения за название здесь)

Вы могли бы сделать это аналогично для значков, заполнителей и в основном структурировать свои параметры таким образом, чтобы это имело смысл как для поставщика, так и для потребителя.

Кроме того, я считаю, что повторное использование этих уже созданных классов параметров может помочь при расширении существующих компонентов.

Комментарии:

1. Спасибо, но вопрос был о подъеме состояния, поэтому я имел в виду лямбда-параметры.

2. Да, я бы сделал что-то подобное для этого, например data class TextFieldState(value: String, onValueChanged: (String) -> Unit)

3. На самом деле, этот подход упоминался даже в вопросе. В любом случае, действительный, спасибо.