Modifireはたくさんつなげてかけると思うのですが、どうなっているんでしょうか?
Modifier
.fillMaxWidth()
.offset(y = targetValue)
.semantics(mergeDescendants = true) {}
CombinedModifierが作られます。CombinedModifierはouterとinnerのModifireを持ち、CombinedModifierは数珠つなぎにできて、複数個あるときはこのouterの方に同じように連なるだけです。
class CombinedModifier(
private val outer: Modifier,
private val inner: Modifier
) : Modifier {
...
上記でタイトルの件は終わりです。
下記は興味があれば。
ModifireのComposable関数を渡せるものはどうなっているのか?
そんなに知られていないかもですが、composed{}というのを使うとModifireの変更をComposable関数の中でできるんですよね。そこがどうなっているのかを見てみます。
MultiMeasureLayout(
modifier = modifier.semantics { designInfoProvider = measurer }
例えばModifier.semantics()
は以下のような形になっていて、composed() {}
でComposable関数を渡しています。このComposable関数はどこでどうやって使われるの??ということです。
fun Modifier.semantics(
mergeDescendants: Boolean = false,
properties: (SemanticsPropertyReceiver.() -> Unit)
): Modifier = composed( // ← ここでcomposed{}を呼び出している
inspectorInfo = debugInspectorInfo {
name = "semantics"
this.properties["mergeDescendants"] = mergeDescendants
this.properties["properties"] = properties
}
) {
val id = remember { SemanticsModifierCore.generateSemanticsId() }
SemanticsModifierCore(id, mergeDescendants, clearAndSetSemantics = false, properties)
}
Lauyout()関数などの実際にレイアウトを行うComposableの中でmaterialize()という関数が呼び出されて、materialize()がModifireがもつComposable関数を呼び出していって、その結果がCombinedModifierに入るだけです。
val materialized = currentComposer.materialize(modifier)
materialize前
materialize後
composed()で渡されたComposable関数が呼ばれて、SemanticsModifierCoreが入っている。