Jetpack ComposeのonSizeChangedとonGloballyPositioned

こんにちは。 今日は Jetpack Composeの公式サンプルアプリの一つであるJetsurveyソースコードでお勉強しています。

そこで onSizeChangedonGloballyPositionedというものが出てきてドキュメントを読み調べてみました。

onSizeChanged

まずこいつですが、名前的にサイズが変更されたときに呼ばれるのかなと思いました。ただ挙動を見ている限りどうも最初も呼ばれている模様。下記のドキュメントに普通に書いていましたが最初のコンポーズ時とサイズが変わった時に呼ばれるみたいです。

[onSizeChanged] wiill only be invoked during the first time measurement or when the size has changed.

またonSizeChangedを下記のように子要素にも記述した場合、初回コンポーズ時は子要素から呼ばれます。(2 -> 1となる。) (これは子要素の大きさが決まって初めて親要素の大きさも決まっていく感じですかね?)

Box(
    modifier = Modifier.onSizeChanged { 1 }
) {
    Box(
        modifier = Modifier.onSizeChanged { 2 }
    )
}

onGloballyPositioned

次はこいつです。 要素の配置が変更されたときに呼ばれます。またドキュメントにもありますが、初回コンポーズ時にもしっかり呼ばれます。

Note that it will be called after a composition when the coordinates are finalized.

下記のような場合は親要素から呼ばれます。(1 -> 2)

Box(
    modifier = Modifier.onGloballyPositioned { 1 }
) {
    Box(
        modifier = Modifier.onGloballyPositioned { 2 }
    )
}