Понимание modifier.<method> vs Modifer.<method>: объяснение эффектов и поведения (Jetpack Compose для разработчиков AndrAndroid

Форум для тех, кто программирует под Android
Ответить Пред. темаСлед. тема
Гость
 Понимание modifier.<method> vs Modifer.<method>: объяснение эффектов и поведения (Jetpack Compose для разработчиков Andr

Сообщение Гость »


Я работаю через разработчиков Android онлайн-руководство по первым приложениям для Android.

У меня есть опыт программирования на C, но очень ограниченный опыт объектно-ориентированного программирования.

Я пытаюсь разобраться, что происходит, когда я вызываю метод с «модификатором». против «Модификатора.». Я предполагаю, что версия в нижнем регистре вызывает метод переданного ей объекта, тогда как версия в верхнем регистре каким-то образом представляет собой новый объект, локальный для дочернего элемента, который вызвал его в качестве параметра. Версия в нижнем регистре, похоже, влияет на предыдущие методы, примененные к этому «родителю». Вот пример того и другого с наблюдаемым поведением. Единственная разница между двумя примерами — это регистр (прописные и строчные) буквы «m» в вызове «модификатора» при первом вызове Text().

Первый пример — желаемое поведение. В первом вызове «Текст» я использую «Модификатор» (заглавные буквы). При этом сохраняется центрированное вертикальное расположение родительского столбца. (Функция OneQuadrant вызывается 4 раза, на изображении ниже показана панель предварительного просмотра)


Изображение


@Composable fun OneQuadrant (название: String, информация: String, bColor: Color, модификатор: Modifier) { Столбец ( HorizontalAlignment = Alignment.CenterHorizontally, вертикальноеРасположение = Расположение.Центр, модификатор = модификатор .fillMaxHeight() .background(bColor) .padding(16.dp) ) { Текст( текст = заголовок, шрифтВес = Жирный, модификатор = Modifier.padding(bottom=16.dp) ) Текст( текст = информация, textAlign = TextAlign.Justify, ) } } Второй пример — нежелательное поведение. Первый вызов «Текст» использует «модификатор» (строчные буквы). Очевидно, это переопределяет центрированное вертикальное расположение в родительском столбце.


Изображение


@Composable fun OneQuadrant (название: String, информация: String, bColor: Color, модификатор: Modifier) { Столбец ( HorizontalAlignment = Alignment.CenterHorizontally, вертикальноеРасположение = Расположение.Центр, модификатор = модификатор .fillMaxHeight() .background(bColor) .padding(16.dp) ) { Текст( текст = заголовок, шрифтВес = Жирный, модификатор = modifier.padding(bottom=16.dp) ) Текст( текст = информация, textAlign = TextAlign.Justify, ) } } Вопрос 1: Во втором примере, даже если версия в нижнем регистре действует на родительского элемента, почему это приведет к отмене центрированного вертикального расположения? Я вижу, что нижнее заполнение и центрирование несовместимы, и, вероятно, преобладает последний вызов. Однако столбец также требует заполнения после оператора Arrangement.Center, и это работает нормально.

Вопрос 2: Если он сопоставляется обратно с родительским элементом, почему вызов внутри столбца также не сопоставляется обратно с своим родительским элементом, поскольку он был передан как параметр?

В3: Какая ментальная модель здесь правильная, чтобы понять, что происходит? Думаю, меня отчасти смущает то, что представляют собой основные объекты. Компонуемые функции имеют имена, напоминающие объекты, но на самом деле это функции, действующие на какой-то другой объект(ы)... верно?

Я читал о «объектах-компаньонах» Kotlin, но это не особо помогло. Я предполагаю, что это как-то связано с поведением передачи по ссылке в Котлине, но я не могу этого понять. Не могли бы вы объяснить или дать ссылку на четкую ссылку? Спасибо!

Если это полезно, вот функция, которая вызывает OneQuadrant 4 раза.

fun DisplayQuadrants(модификатор: Модификатор = Модификатор) { Столбец (modifier.fillMaxWidth()) { Строка (modifier.weight(1f)){ ОдинКвадрант( заголовок = stringResource(R.string.text_composable), информация = stringResource(R.string.displays_text), бЦвет = Цвет(0xFFEADDFF), модификатор = modifier.weight(1f) ) ОдинКвадрант( заголовок = stringResource(R.string.image_composable), информация = stringResource(R.string.creates_composable), бЦвет = Цвет (0xFFD0BCFF), модификатор = modifier.weight(1f) ) } Строка (modifier.weight(1f)){ ОдинКвадрант ( заголовок = stringResource(R.string.row_composable), информация = stringResource(R.string.a_layout), бЦвет = Цвет (0xFFD0BCFF), модификатор = modifier.weight(1f) ) ОдинКвадрант( заголовок = stringResource(R.string.column_composable), информация = stringResource(R.string.vertical), бЦвет = Цвет (0xFFF6EDFF), модификатор = modifier.weight(1f) ) } } } Этот «DisplayQuadrants» вызывается в MainActivity следующим образом:
класс MainActivity : ComponentActivity() { переопределить fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContent { КвадрантыТема { // Поверхностный контейнер, использующий цвет фона из темы Поверхность( модификатор = Модификатор.fillMaxSize(), цвет = MaterialTheme.colorScheme.background ) { DisplayQuadrants(модификатор = Модификатор) } } } } }
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение
  • Понимание modifier.<method> vs Modifer.<method>: объяснение эффектов и поведения (Jetpack Compose для разработчиков Andr
    Anonymous » » в форуме Android
    0 Ответы
    86 Просмотры
    Последнее сообщение Anonymous
  • Modifier.wrapContentWidth() против Modifier.width(IntrinsicSize.Max) в Android Jetpack Compose
    Anonymous » » в форуме Android
    0 Ответы
    34 Просмотры
    Последнее сообщение Anonymous
  • Modifier.wrapContentWidth() против Modifier.width(IntrinsicSize.Max) в Android Jetpack Compose
    Anonymous » » в форуме Android
    0 Ответы
    21 Просмотры
    Последнее сообщение Anonymous
  • Modifier.wrapContentWidth() против Modifier.width(IntrinsicSize.Max) в Android Jetpack Compose
    Anonymous » » в форуме Android
    0 Ответы
    22 Просмотры
    Последнее сообщение Anonymous
  • Modifier.wrapContentWidth() против Modifier.width(IntrinsicSize.Max) в Android Jetpack Compose
    Anonymous » » в форуме Android
    0 Ответы
    16 Просмотры
    Последнее сообщение Anonymous

Вернуться в «Android»