फ़ेज़ के हिसाब से मॉडिफ़ायर का ब्रेकडाउन

Jetpack Compose, मॉडिफ़ायर को अलग-अलग फ़ेज़ में लागू करता है. नीचे दिए गए ब्रेकडाउन से पता चलता है कि सामान्य मॉडिफ़ायर किस फ़ेज़ से जुड़े हैं और उनके आर्ग्युमेंट या लैम्डा का आकलन कब किया जाता है.

पहला चरण: कंपोज़िशन फ़ेज़

ये मॉडिफ़ायर, @Composable body में मौजूद आर्ग्युमेंट का आकलन सिंक्रोनस तरीके से करते हैं. यहां पढ़ी गई कोई भी स्थिति, कंपोज़ेबल रीस्टार्ट स्कोप के साथ निर्भरता रजिस्टर करती है. साथ ही, बदलने पर पूरे कंपोज़ेबल को फिर से कंपोज़ करती है.

  • स्टैटिक डाइमेंशन और साइज़ बदलने वाले मॉडिफ़ायर:
    • Modifier.size(dp), Modifier.width(dp), Modifier.height(dp)
    • Modifier.fillMaxSize(), Modifier.fillMaxWidth(), Modifier.fillMaxHeight()
    • Modifier.wrapContentSize(), Modifier.wrapContentWidth(), Modifier.wrapContentHeight()
    • Modifier.requiredSize(), Modifier.defaultMinSize()
    • Modifier.aspectRatio(ratio)
    • Modifier.weight(weight) ( RowScope या ColumnScopeमें)
    • Modifier.width(IntrinsicSize.Min / Max)
    • Modifier.height(IntrinsicSize.Min / Max)
  • स्टैटिक स्पेसिंग और इंसर्ट:
    • Modifier.padding(all = dp), Modifier.padding(start, top, end, bottom)
    • Modifier.windowInsetsPadding(insets), Modifier.statusBarsPadding()
  • वैल्यू में सीधे तौर पर बदलाव करने वाले विज़ुअल मॉडिफ़ायर:
    • Modifier.alpha(float) (reads state during composition)
    • Modifier.rotate(degrees) (reads state during composition)
    • Modifier.scale(scaleX, scaleY) (reads state during composition)
    • Modifier.background(color = Color, shape = Shape)
    • Modifier.border(width, color, shape)
    • Modifier.shadow(elevation, shape)
    • Modifier.clip(shape)
    • Modifier.blur(radius)
  • स्टैटिक पोज़िशन मॉडिफ़ायर:
    • Modifier.offset(x = dp, y = dp) (direct value overload)
    • Modifier.absoluteOffset(x = dp, y = dp)
  • डाइनैमिक कंपोज़ेबल मॉडिफ़ायर:
    • Modifier.composed { ... } (कंपोज़िशन के दौरान फ़ैक्ट्री बॉडी को चलाता है)

दूसरा चरण: लेआउट का चरण

लेआउट फ़ेज़ को दो अलग-अलग सब-स्टेप में बांटा गया है. इनमें अमान्य करने के अलग-अलग स्कोप होते हैं:

दूसरा चरण: मेज़रमेंट

इससे साइज़ (width, height) और पाबंदियों का पता चलता है. यहां दी गई स्थिति में, फिर से मेज़रमेंट और फिर से प्लेसमेंट ट्रिगर होता है:

  • Modifier.layout { measurable, constraints -> ... }: मेज़रमेंट के दौरान layout(w, h) से पहले का कोड एक्ज़ीक्यूट होता है.

दूसरा चरण: प्लेसमेंट और लेआउट के लिए कॉलबैक

इससे (x, y) की जगह की जानकारी मिलती है. यहां स्टेट को पढ़ने से, सिर्फ़ फिर से प्लेसमेंट ट्रिगर होता है. इसमें मेज़रमेंट और कंपोज़िशन को स्किप किया जाता है:

  • Modifier.offset { IntOffset(x, y) } (lambda overload)
  • Modifier.absoluteOffset { IntOffset(x, y) } (lambda overload)
  • Modifier.layout { ... layout(w, h) { placeable.place(x, y) } }: layout(w, h) { ... } ब्लॉक में मौजूद कोड.
  • Modifier.onPlaced { layoutCoordinates -> ... }: प्लेसमेंट के दौरान पैरंट के कोऑर्डिनेट तय होने के बाद, इसे शुरू किया जाता है.
  • Modifier.onSizeChanged { intSize -> ... }: अगर साइज़ बदल गया है, तो लेआउट मेज़रमेंट पूरा होने के बाद इस फ़ंक्शन को कॉल किया जाता है.
  • Modifier.onGloballyPositioned { layoutCoordinates -> ... }: इस फ़ंक्शन को तब कॉल किया जाता है, जब विंडो लेआउट का पूरा पास खत्म हो जाता है.

तीसरा चरण: ड्रॉइंग फ़ेज़

ये मॉडिफ़ायर, कैनवस ड्रॉइंग के दौरान लागू होते हैं. इन ब्लॉक में पढ़ी गई स्थिति, कंपोज़िशन और लेआउट, दोनों को स्किप करती है. इससे सिर्फ़ ड्रॉ पास चलता है:

  • Modifier.graphicsLayer { ... }:
    • लैंबडा में अपडेट की गई प्रॉपर्टी: alpha, translationX, translationY, scaleX, scaleY, rotationX, rotationY, rotationZ, shadowElevation, shape, clip, renderEffect, transformOrigin.
  • Modifier.drawBehind { ... }:
    • यह कंपोज़ेबल कॉन्टेंट के पीछे कैनवस कमांड ड्रॉ करता है.
  • Modifier.drawWithContent { ... }:
    • इस विकल्प की मदद से, drawContent() की मदद से ड्रॉइंग के क्रम को कंट्रोल किया जाता है.
  • Modifier.drawWithCache { ... }:
    • आउटर ब्लॉक, Path, Paint या Brush ऑब्जेक्ट के साइज़ या लेआउट में बदलाव होने पर चलता है. onDrawBehind या onDrawWithContent, हर फ़्रेम ड्रॉ पर चलता है.

रीकंपोज़िशन लूप के बाहर - ऑब्ज़र्वेशन मॉडिफ़ायर

कुछ मॉडिफ़ायर, ऐक्सेसिबिलिटी, उपयोगकर्ता के इनपुट, और लाइफ़साइकल के बारे में जानकारी पाने के लिए, तीन फ़्रेम फ़ेज़ के बाहर काम करते हैं.

सिमैंटिक और सुलभता

यह कुकी, सुलभता सेवाओं (TalkBack) और टेस्टिंग के लिए सिमैंटिक प्रॉपर्टी प्रोसेस करती है:

  • Modifier.semantics { ... }
  • Modifier.clearAndSetSemantics { ... }

इनपुट, जेस्चर, और इवेंट

यह तीन फ़ेज़ वाली फ़्रेम रेंडरिंग पाइपलाइन के बाहर काम करता है. इसे ओएस मोशन इवेंट और उपयोगकर्ता के इंटरैक्शन मिलते हैं:

  • Modifier.pointerInput(key) { detectTapGestures { ... } } / detectDragGestures / awaitPointerEventScope
  • Modifier.clickable(enabled, onClickLabel) { ... }
  • Modifier.combinedClickable { ... }
  • Modifier.toggleable { ... }
  • Modifier.selectable { ... }
  • Modifier.draggable(...) / Modifier.scrollable(...) / Modifier.draggable2D(...)
  • Modifier.onFocusChanged { focusState -> ... }
  • Modifier.onKeyEvent { keyEvent -> ... }
  • Modifier.onVisibilityChanged { isVisible -> ... }: कॉलबैक तब शुरू होता है, जब कॉन्फ़िगर किए गए समय के बाद किसी कंपोज़ेबल की विज़िबिलिटी बदल जाती है. ऐसा को-रूटीन में होता है.

क्विक रेफ़रंस: वैल्यू वर्सेस लैम्ब्डा फ़ेज़

किसी लैम्डा में स्टेट वैल्यू को पढ़ने से, उसे बाद के फ़ेज़ में पढ़ा जाता है. इससे, स्टेट में बदलाव होने पर पहले के फ़ेज़ स्किप हो जाते हैं:

मॉडिफ़ायर / पैटर्न डायरेक्ट वैल्यू (कंपोज़िशन) लैम्डा वैरिएंट (डिफ़र्ड फ़ेज़) स्टेट में बदलाव होने पर
ऑफ़सेट Modifier.offset(x, y) Modifier.offset { IntOffset(x, y) } लेआउट (प्लेसमेंट) (स्किप कंपोज़िशन)
ऐल्फ़ा / ओपैसिटी Modifier.alpha(alpha) Modifier.graphicsLayer { this.alpha = alpha } ड्रॉइंग (इसमें कंपोज़िशन और लेआउट को छोड़ दिया जाता है)
रोटेशन Modifier.rotate(degrees) Modifier.graphicsLayer { rotationZ = degrees } ड्रॉइंग (इसमें कंपोज़िशन और लेआउट को छोड़ दिया जाता है)
स्केल Modifier.scale(scale) Modifier.graphicsLayer { scaleX = s; scaleY = s } ड्रॉइंग (इसमें कंपोज़िशन और लेआउट को छोड़ दिया जाता है)
अनुवाद Modifier.padding(...) Modifier.graphicsLayer { translationX = ... } ड्रॉइंग (इसमें कंपोज़िशन और लेआउट को छोड़ दिया जाता है)
बैकग्राउंड का रंग Modifier.background(color) Modifier.drawBehind { drawRect(color) } ड्रॉइंग (इसमें कंपोज़िशन और लेआउट को छोड़ दिया जाता है)
स्क्रोल / पैरलैक्स Modifier.offset(scroll.dp) Modifier.offset { IntOffset(0, scroll) } लेआउट (प्लेसमेंट) (स्किप कंपोज़िशन)

Modifier.Node इंटरफ़ेस मैपिंग

ज़्यादा परफ़ॉर्मेंस वाले Modifier.Node एपीआई का इस्तेमाल करके बनाए गए कस्टम मॉडिफ़ायर के लिए, फ़ेज़ सीधे तौर पर नोड की क्षमता वाले इंटरफ़ेस से मैप होते हैं:

चरण Modifier.Node इंटरफ़ेस कीमत तय करने के मुख्य तरीके
लेआउट (मेज़रमेंट और प्लेसमेंट) LayoutModifierNode measure(measurable, constraints)
लेआउट (ग्लोबल कोऑर्डिनेट) GlobalPositionAwareModifierNode onGloballyPositioned(coordinates)
लेआउट (प्लेसमेंट) LayoutAwareModifierNode onRemeasured(size), onPlaced(coordinates)
ड्रॉइंग DrawModifierNode draw(ContentDrawScope)
इनपुट / पॉइंटर PointerInputModifierNode onPointerEvent(...), onCancelPointerInput()
सिमैंटिक SemanticsModifierNode applySemantics(SemanticsPropertyReceiver)
फ़ोकस FocusEventModifierNode onFocusEvent(focusState)