メソッドチェーンでかけるModifireのデータ構造はどうなっているか


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前

ComposedModifireというものが入っている。

materialize後

composed()で渡されたComposable関数が呼ばれて、SemanticsModifierCoreが入っている。