Upgrade to Pro — share decks privately, control downloads, hide ads and more …

2024 컴포즈 정원사

Ji Sungbin
September 01, 2024

2024 컴포즈 정원사

Ji Sungbin

September 01, 2024
Tweet

More Decks by Ji Sungbin

Other Decks in Programming

Transcript

  1. T opics Applier UI 노드 순회 담당 Recomposer UI 노드

    새로고침 담당 Composition UI 노드 관리 담당 __ . (*). /\-| -;-| (*) |___
  2. T opics Applier UI 노드 순회 담당 Recomposer UI 노드

    새로고침 담당 Composition UI 노드 관리 담당 __ . (*). /\-| -;-| (*) |___
  3. Material (Card) @Composable @Composable (content: () -> Unit) {
 (

    Modifier. (...)) {
 content()
 }
 } fun Card surface Box modifier = __ . (*). /\-| -;-| (*) |___
  4. Material (Card) F oundation (Box) @Composable @Composable (content: BoxScope.() ->

    Unit) { ( { BoxScopeInstance.content() } ) } fun Box Layout content = __ . (*). /\-| -;-| (*) |___
  5. Material (Card) F oundation (Box) Ui (Layout) @Composable @Composable (content:

    () -> Unit) {
 (
 ComposeUiNode. ,
 content
 )
 } fun Layout ComposeNode factory = content = Constructor __ . (*). /\-| -;-| (*) |___
  6. Material (Card) F oundation (Box) Ui (Layout) Runtime (ComposeNode) @Composable

    @Composable < (
 factory: () -> ,
 content: () -> Unit
 ) {
 .startNode()
 .createNode(factory)
 content()
 .endNode()
 } fun T> ComposeNode T currentComposer currentComposer currentComposer __ . (*). /\-| -;-| (*) |___
  7. Description Header Image Title Row Icon Topic Topic Row Column

    Column HeaderImage Row Title Icon Description Row Topic Topic {
 ()
 {
 ()
 ()
 }
 ()
 {
 ()
 ()
 }
 } __ . (*). /\-| -;-| (*) |___
  8. Applier 사용된 컴포저블을 트리 구조로 배치하고 순회하는 방법을 정의합니다. current:

    현재 컴포저블 down(): 현재 컴포저블의 다음 자식 컴포저블로 이동 insert(): 현재 컴포저블에 자식 컴포저블 추가 up(): 현재 컴포저블의 부모 컴포저블로 이동 __ . (*). /\-| -;-| (*) |___
  9. Column current Column {
 HeaderImage()
 Row {
 Title()
 Icon()
 }


    Description()
 Row {
 Topic()
 Topic()
 }
 } __ . (*). /\-| -;-| (*) |___
  10. Header Image insert() Column Column HeaderImage {
 ()
 Row {


    Title()
 Icon()
 }
 Description()
 Row {
 Topic()
 Topic()
 }
 } __ . (*). /\-| -;-| (*) |___
  11. Header Image down() Column Column HeaderImage {
 ()
 Row {


    Title()
 Icon()
 }
 Description()
 Row {
 Topic()
 Topic()
 }
 } __ . (*). /\-| -;-| (*) |___
  12. Header Image Column Column HeaderImage {
 ()
 Row {
 Title()


    Icon()
 }
 Description()
 Row {
 Topic()
 Topic()
 }
 } __ . (*). /\-| -;-| (*) |___
  13. up() Header Image Column Column HeaderImage {
 ()
 Row {


    Title()
 Icon()
 }
 Description()
 Row {
 Topic()
 Topic()
 }
 } __ . (*). /\-| -;-| (*) |___
  14. Header Image Column Column HeaderImage {
 ()
 Row {
 Title()


    Icon()
 }
 Description()
 Row {
 Topic()
 Topic()
 }
 } __ . (*). /\-| -;-| (*) |___
  15. Header Image Row insert() Column Column HeaderImage Row {
 ()


    {
 Title()
 Icon()
 }
 Description()
 Row {
 Topic()
 Topic()
 }
 } __ . (*). /\-| -;-| (*) |___
  16. Header Image Row Column Column HeaderImage Row {
 ()
 {


    Title()
 Icon()
 }
 Description()
 Row {
 Topic()
 Topic()
 }
 } down() __ . (*). /\-| -;-| (*) |___
  17. Header Image Row Column Column HeaderImage Row {
 ()
 {


    Title()
 Icon()
 }
 Description()
 Row {
 Topic()
 Topic()
 }
 } __ . (*). /\-| -;-| (*) |___
  18. Header Image insert() Title Row Column Column HeaderImage Row Title

    {
 ()
 {
 ()
 Icon()
 }
 Description()
 Row {
 Topic()
 Topic()
 }
 } __ . (*). /\-| -;-| (*) |___
  19. Header Image down() Title Row Column Column HeaderImage Row Title

    {
 ()
 {
 ()
 Icon()
 }
 Description()
 Row {
 Topic()
 Topic()
 }
 } __ . (*). /\-| -;-| (*) |___
  20. Header Image Title Row Column Column HeaderImage Row Title {


    ()
 {
 ()
 Icon()
 }
 Description()
 Row {
 Topic()
 Topic()
 }
 } __ . (*). /\-| -;-| (*) |___
  21. Header Image Title Row Column Column HeaderImage Row Title {


    ()
 {
 ()
 Icon()
 }
 Description()
 Row {
 Topic()
 Topic()
 }
 } up() __ . (*). /\-| -;-| (*) |___
  22. Header Image Title Row Column Column HeaderImage Row Title {


    ()
 {
 ()
 Icon()
 }
 Description()
 Row {
 Topic()
 Topic()
 }
 } __ . (*). /\-| -;-| (*) |___
  23. Header Image insert() Title Column Icon Row Column HeaderImage Row

    Title Icon {
 ()
 {
 ()
 ()
 }
 Description()
 Row {
 Topic()
 Topic()
 }
 } __ . (*). /\-| -;-| (*) |___
  24. Header Image down() Title Column Icon Row Column HeaderImage Row

    Title Icon {
 ()
 {
 ()
 ()
 }
 Description()
 Row {
 Topic()
 Topic()
 }
 } __ . (*). /\-| -;-| (*) |___
  25. Header Image Title Column Icon Row Column HeaderImage Row Title

    Icon {
 ()
 {
 ()
 ()
 }
 Description()
 Row {
 Topic()
 Topic()
 }
 } __ . (*). /\-| -;-| (*) |___
  26. Header Image Title Column Icon Row Column HeaderImage Row Title

    Icon {
 ()
 {
 ()
 ()
 }
 Description()
 Row {
 Topic()
 Topic()
 }
 } up() __ . (*). /\-| -;-| (*) |___
  27. Header Image Title Column Icon Row Column HeaderImage Row Title

    Icon {
 ()
 {
 ()
 ()
 }
 Description()
 Row {
 Topic()
 Topic()
 }
 } __ . (*). /\-| -;-| (*) |___
  28. Header Image Title Column Icon Row Column HeaderImage Row Title

    Icon {
 ()
 {
 ()
 ()
 }
 Description()
 Row {
 Topic()
 Topic()
 }
 } up() __ . (*). /\-| -;-| (*) |___
  29. Header Image Title Column Icon Row Column HeaderImage Row Title

    Icon {
 ()
 {
 ()
 ()
 }
 Description()
 Row {
 Topic()
 Topic()
 }
 } __ . (*). /\-| -;-| (*) |___
  30. Header Image Title Icon Row Description Column insert() Column HeaderImage

    Row Title Icon Description {
 ()
 {
 ()
 ()
 }
 ()
 Row {
 Topic()
 Topic()
 }
 } __ . (*). /\-| -;-| (*) |___
  31. Header Image Title Icon Row Description Column down() Column HeaderImage

    Row Title Icon Description {
 ()
 {
 ()
 ()
 }
 ()
 Row {
 Topic()
 Topic()
 }
 } __ . (*). /\-| -;-| (*) |___
  32. Header Image Title Icon Row Description Column Column HeaderImage Row

    Title Icon Description {
 ()
 {
 ()
 ()
 }
 ()
 Row {
 Topic()
 Topic()
 }
 } __ . (*). /\-| -;-| (*) |___
  33. Header Image Title Icon Row Description Column Column HeaderImage Row

    Title Icon Description {
 ()
 {
 ()
 ()
 }
 ()
 Row {
 Topic()
 Topic()
 }
 } up() __ . (*). /\-| -;-| (*) |___
  34. Header Image Title Icon Row Description Column Column HeaderImage Row

    Title Icon Description {
 ()
 {
 ()
 ()
 }
 ()
 Row {
 Topic()
 Topic()
 }
 } __ . (*). /\-| -;-| (*) |___
  35. Header Image Title Icon Row Description Row Column Column HeaderImage

    Row Title Icon Description Row {
 ()
 {
 ()
 ()
 }
 ()
 {
 Topic()
 Topic()
 }
 } insert() __ . (*). /\-| -;-| (*) |___
  36. Header Image Title Icon Row Description Row Column Column HeaderImage

    Row Title Icon Description Row {
 ()
 {
 ()
 ()
 }
 ()
 {
 Topic()
 Topic()
 }
 } down() __ . (*). /\-| -;-| (*) |___
  37. Header Image Title Icon Row Description Row Column Column HeaderImage

    Row Title Icon Description Row {
 ()
 {
 ()
 ()
 }
 ()
 {
 Topic()
 Topic()
 }
 } __ . (*). /\-| -;-| (*) |___
  38. Header Image Title Icon Row Description Column Topic Row insert()

    Column HeaderImage Row Title Icon Description Row Topic {
 ()
 {
 ()
 ()
 }
 ()
 {
 ()
 Topic()
 }
 } __ . (*). /\-| -;-| (*) |___
  39. Header Image Title Icon Row Description Column Topic Row down()

    Column HeaderImage Row Title Icon Description Row Topic {
 ()
 {
 ()
 ()
 }
 ()
 {
 ()
 Topic()
 }
 } __ . (*). /\-| -;-| (*) |___
  40. Header Image Title Icon Row Description Column Topic Row Column

    HeaderImage Row Title Icon Description Row Topic {
 ()
 {
 ()
 ()
 }
 ()
 {
 ()
 Topic()
 }
 } __ . (*). /\-| -;-| (*) |___
  41. Header Image Title Icon Row Description Column Topic Row Column

    HeaderImage Row Title Icon Description Row Topic {
 ()
 {
 ()
 ()
 }
 ()
 {
 ()
 Topic()
 }
 } up() __ . (*). /\-| -;-| (*) |___
  42. Header Image Title Icon Row Description Column Topic Row Column

    HeaderImage Row Title Icon Description Row Topic {
 ()
 {
 ()
 ()
 }
 ()
 {
 ()
 Topic()
 }
 } __ . (*). /\-| -;-| (*) |___
  43. Header Image Title Icon Row Description insert() Column Topic Topic

    Row Column HeaderImage Row Title Icon Description Row Topic Topic {
 ()
 {
 ()
 ()
 }
 ()
 {
 ()
 ()
 }
 } __ . (*). /\-| -;-| (*) |___
  44. Header Image Title Icon Row Description down() Column Topic Topic

    Row Column HeaderImage Row Title Icon Description Row Topic Topic {
 ()
 {
 ()
 ()
 }
 ()
 {
 ()
 ()
 }
 } __ . (*). /\-| -;-| (*) |___
  45. Header Image Title Icon Row Description Column Topic Topic Row

    Column HeaderImage Row Title Icon Description Row Topic Topic {
 ()
 {
 ()
 ()
 }
 ()
 {
 ()
 ()
 }
 } __ . (*). /\-| -;-| (*) |___
  46. Header Image Title Icon Row Description Column Topic Topic Row

    Column HeaderImage Row Title Icon Description Row Topic Topic {
 ()
 {
 ()
 ()
 }
 ()
 {
 ()
 ()
 }
 } up() __ . (*). /\-| -;-| (*) |___
  47. Header Image Title Icon Row Description Column Topic Topic Row

    Column HeaderImage Row Title Icon Description Row Topic Topic {
 ()
 {
 ()
 ()
 }
 ()
 {
 ()
 ()
 }
 } __ . (*). /\-| -;-| (*) |___
  48. Header Image Title Icon Row Description Column Topic Topic Row

    Column HeaderImage Row Title Icon Description Row Topic Topic {
 ()
 {
 ()
 ()
 }
 ()
 {
 ()
 ()
 }
 } up() __ . (*). /\-| -;-| (*) |___
  49. Column HeaderImage Row Title Icon Description Row Topic Topic {


    ()
 {
 ()
 ()
 }
 ()
 {
 ()
 ()
 }
 } Header Image Title Icon Row Description Column Topic Topic Row __ . (*). /\-| -;-| (*) |___
  50. Applier 컴포저블 노드를 트리 구조로 배치하고 순회하는 방법을 정의합니다. current:

    현재 노드 down(): 현재 노드의 다음 자식 노드로 이동 insert(): 현재 노드에 자식 노드 추가 up(): 현재 노드의 바로 앞(위) 부모 노드로 이동 __ . (*). /\-| -;-| (*) |___
  51. current: 현재 노드 down(): 현재 노드의 다음 자식 노드로 이동

    up(): 현재 노드의 바로 앞(위) 부모 노드로 이동 insertTopDown(): 현재 노드에 하향식 방법으로 자식 노드 추가 insertBottomUp(): 현재 노드에 상향식 방법으로 자식 노드 추가 remove(): 특정 위치에 있는 노드 제거 move(): 특정 위치에 있는 노드를 다른 위치로 이동 clear(): 모든 노드 제거 Applier __ . (*). /\-| -;-| (*) |___
  52. Compose Ui Applier -> UiApplie U 상향식인 insertBottomUp() 사용 Node

    -> LayoutNod4  LayoutNode#foldedChildren에 자식 노드 추  자식 노드도 LayoutNode로 동일 __ . (*). /\-| -;-| (*) |___
  53. T opics Applier UI 노드 순회 담당 Recomposer UI 노드

    새로고침 담당 Composition UI 노드 관리 담당 __ . (*). /\-| -;-| (*) |___
  54. State의 변경이 감지되면, 
 해당 State를 읽는 LayoutNode의 새로고침을 예약합니다.

    Recomposer#runRecomposeAndApplyChanges Recomposer __ . (*). /\-| -;-| (*) |___
  55. suspend fun while runRecomposeAndApplyChanges() { ( ) { awaitStateChanged() /

    whenNewFrameRequested { } } } shouldKeepRecomposing / State에 변경이 감지될 때까지 suspend로 대기 // 새로운 프레임이 요청될 때까지 suspend로 대기 // LayoutNode 새로고침 __ . (*). /\-| -;-| (*) |___
  56. T opics Applier UI 노드 순회 담당 Recomposer UI 노드

    새로고침 담당 Composition UI 노드 관리 담당 __ . (*). /\-| -;-| (*) |___
  57. Applier + Recomposer -> Composition // ComponentActivity#setContent의 최종 호출 함수

    (요약됨) // Applier와 Recomposer를 사용하여 빈 트리 생성 // 생성된 트리에 first-composition 진행 (컴포저블 초기 상태 배치)
 fun val doSetContent(content: () -> Unit) { composition = Composition(UiApplier(), Recomposer()) composition.setContent(content) } @Composable __ . (*). /\-| -;-| (*) |___
  58. composition.setContent { { ( ) ( ) { ( )

    ( ) } } } < , > (factory: () -> ) {
 .startNode()
 .createNode(factory)
 .endNode()
 } // 모든 컴포저블이 결국 ComposeNode<LayoutNode, UiApplier>()로 Runtime에게 전달됨
 // insert(), down()
 // insert(), down(), up()
 // insert(), down(), up() // insert(), down() // insert(), down(), up() // insert(), down(), up() // up()
 // up() Column Text Text Row Text Text "Hello" "World!" "Jetpack" "Compose" @Composable fun Node Applier Node ComposeNode currentComposer currentComposer currentComposer __ . (*). /\-| -;-| (*) |___
  59. Column {
 Text("Hello")
 Text("World!")
 Row {
 Text("Jetpack")
 Text("Compose")
 }
 }

    Column 루트 컴포저블인 Column으로 Composition 시작
 -> 초기 UI 트리 생성 __ . (*). /\-| -;-| (*) |___
  60. Column Text {
 ( )
 "Hello" Text("World!")
 Row {
 Text("Jetpack")


    Text("Compose")
 }
 } Column “Hello“ __ . (*). /\-| -;-| (*) |___
  61. Column “World!” “Hello“ Column Text Text {
 ( )
 (

    )
 "Hello" "World!" Row {
 Text("Jetpack")
 Text("Compose")
 }
 } __ . (*). /\-| -;-| (*) |___
  62. Column “World!” “Hello“ Row Column Text Text Row {
 (

    )
 ( )
 "Hello" "World!" {
 Text("Jetpack")
 Text("Compose")
 }
 } __ . (*). /\-| -;-| (*) |___
  63. Column “Jetpack” “World!” “Hello“ Row Column Text Text Row Text

    {
 ( )
 ( )
 {
 ( )
 "Hello" "World!" "Jetpack" Text("Compose")
 }
 } __ . (*). /\-| -;-| (*) |___
  64. Column “Jetpack” “World!” “Hello“ “Compose” Row Column Text Text Row

    Text Text {
 ( )
 ( )
 {
 ( )
 ( )
 "Hello" "World!" "Jetpack" "Compose" }
 } __ . (*). /\-| -;-| (*) |___
  65. Column “Jetpack” “World!” “Hello“ “Compose” Row Column Text Text Row

    Text Text {
 ( )
 ( )
 {
 ( )
 ( )
 }
 } "Hello" "World!" "Jetpack" "Compose" __ . (*). /\-| -;-| (*) |___
  66. 여기까지가 Compose Runtime의 핵심 Applier 컴포저블 노드를 트리 구조로 배치하고


    순회하는 방법을 정의합니다. Recomposer State의 변경이 감지되면, 
 해당 State를 읽는 LayoutNode의
 새로고침을 예약합니다. Composition Applier가 작동할 트리를 생성하고, 생명주기에 맞게 트리 인스턴스를 관리합니다. __ . (*). /\-| -;-| (*) |___
  67.  TexÆ  List (ordered) Hello Markdown! This is my

    list& $# First ite6 !# Second ite6 %# Third item Goodbye Markdown! __ . (*). /\-| -;-| (*) |___