Compose의 안정성

Compose는 유형을 안정적이거나 불안정한 것으로 간주합니다. 유형이 안정적입니다. 변경할 수 없거나 Compose에서 값에 리컴포지션 간에 변경됩니다. Compose에서 알 수 없는 경우 유형이 불안정함 리컴포지션 간에 값이 변경되었습니다.

Compose는 컴포저블 매개변수의 안정성을 사용하여 컴포저블이 리컴포지션 중에 컴포저블을 건너뛸 수 있습니다.

  • 안정적인 매개변수: 컴포저블에 안정적이지 않은 매개변수가 있는 경우 변경하면 Compose에서 건너뜁니다.
  • 불안정한 매개변수: 컴포저블에 불안정한 매개변수가 있으면 Compose는 는 구성요소의 상위를 재구성할 때 항상 이를 재구성합니다.

Compose가 항상 사용하는 불필요하게 불안정한 구성요소가 앱에 많이 포함된 경우 성능 문제와 기타 문제가 발생할 수 있습니다.

이 문서에서는 앱 안정성을 높여 앱을 개선하는 방법을 자세히 설명합니다. 전반적인 사용자 환경을 개선할 수 있습니다.

변경 불가능한 객체

다음 스니펫은 안정성과 재구성할 수 있습니다

Contact 클래스는 변경 불가능한 데이터 클래스입니다. 그 이유는 매개변수는 val 키워드로 정의된 프리미티브입니다. 생성 후에는 Contact의 인스턴스이므로 객체 속성 값을 변경할 수 없습니다. 그렇게 하려고 하면 새 객체를 만듭니다.

data class Contact(val name: String, val number: String)

ContactRow 컴포저블에는 Contact 유형의 매개변수가 있습니다.

@Composable
fun ContactRow(contact: Contact, modifier: Modifier = Modifier) {
   var selected by remember { mutableStateOf(false) }

   Row(modifier) {
      ContactDetails(contact)
      ToggleButton(selected, onToggled = { selected = !selected })
   }
}

사용자가 전환 버튼을 클릭하고 selected 상태 변경:

  1. Compose는 ContactRow 내에서 코드를 재구성해야 하는지 평가합니다.
  2. ContactDetails의 유일한 인수는 Contact 유형입니다.
  3. Contact는 변경할 수 없는 데이터 클래스이므로 Compose는 다음 중 어느 것도 ContactDetails의 인수가 변경되었습니다.
  4. 따라서 Compose는 ContactDetails를 건너뛰고 재구성하지 않습니다.
  5. 반면 ToggleButton의 인수는 변경되었습니다. Compose는 이 구성요소를 재구성합니다.

변경 가능한 객체

앞의 예에서는 변경 불가능한 객체를 사용하지만, 변경할 수 있는 객체입니다. 다음 스니펫을 생각해 보세요.

data class Contact(var name: String, var number: String)

이제 Contact의 각 매개변수가 var이므로 클래스는 더 이상 변경할 수 없습니다. 속성이 변경되면 Compose에서 인식하지 못합니다. 이는 Compose는 Compose 상태 객체의 변경사항만 추적합니다.

Compose는 이러한 클래스를 불안정하다고 간주합니다. Compose는 살펴보겠습니다. 따라서 Contact가 이런 방식으로 정의되었다면 ContactRow는 이전 예에서 selected가 변경될 때마다 재구성됩니다.

Compose에서의 구현

Compose가 리컴포지션 중에 건너뛸 함수를 결정합니다.

Compose 컴파일러가 코드에서 실행될 때 각 함수와 유형을 표시합니다. 여러 태그 중 하나로 대체합니다. 이러한 태그는 Compose가 함수를 처리하는 방법 또는 유형을 반환합니다.

함수

Compose는 함수를 skippable 또는 restartable로 표시할 수 있습니다. 참고: 함수를 다음 중 하나로 표시하거나 둘 다 표시하거나 둘 다 표시하지 않습니다.

  • 건너뛸 수 있음: 컴파일러가 컴포저블을 건너뛸 수 있는 것으로 표시하면 Compose는 모든 인수가 이전 값입니다.
  • 다시 시작 가능: 다시 시작할 수 있는 컴포저블이 '범위' 역할을 합니다. 각 항목의 의미는 다음과 같습니다. 재구성이 시작될 수 있습니다 즉, 함수가 Compose가 리컴포지션을 위한 코드 재실행을 시작할 수 있는 위치를 나타내는 항목 상태를 변경할 수 있습니다

유형

Compose는 유형을 변경할 수 없거나 안정적인 것으로 표시합니다. 각 유형은 하나 또는 기타:

  • 변경 불가능: Compose는 다음 요소의 값이 변경 불가능하다고 표시합니다. 속성은 변경될 수 없으며 모든 메서드는 참조적으로 투명합니다.
    • 모든 기본형은 변경 불가능으로 표시됩니다. 여기에는 String, Int, Float
  • 안정적: 생성 후 속성이 변경될 수 있는 유형을 나타냅니다. 런타임 중에 이러한 속성이 변경되는 경우 Compose는 확인할 수 있습니다
를 통해 개인정보처리방침을 정의할 수 있습니다.

디버그 안정성

매개변수가 변경되지 않은 컴포저블을 앱에서 재구성하는 경우 먼저 명확하게 변경 가능한 매개변수에 대한 정의를 확인하세요. 편지쓰기는 항상 var 속성이 있는 유형 또는 val이 있는 유형을 전달하는 경우 구성요소를 재구성합니다. 속성을 사용할 수 있습니다.

안정성과 관련된 복잡한 문제를 진단하는 방법에 대한 자세한 내용은 Compose에 관한 자세한 내용은 디버그 안정성 가이드를 참고하세요.

안정성 문제 해결

Compose 구현의 안정성을 확보하는 방법에 관한 자세한 내용은 다음을 참고하세요. 안정성 문제 해결 가이드를 참고하세요.

요약

전반적으로 다음 사항에 유의해야 합니다.

  • 매개변수: Compose가 각 매개변수의 안정성을 결정합니다. 구성 가능한 함수를 사용하여 그 중에 어떤 컴포저블을 건너뛰어야 하는지 결정합니다. 재구성할 수 있습니다
  • 즉각적인 해결 방법: 컴포저블을 건너뛰지 않고 그리고 성능 문제를 일으킨다면 먼저 var 매개변수와 같은 불안정성을 살펴보겠습니다
  • 컴파일러 보고서: 컴파일러 보고서를 사용하여 다음을 수행할 수 있습니다. 클래스에 관해 어떤 안정성이 추론되는지 결정합니다.
  • 컬렉션: Compose는 List, SetMap으로. 이는 잔여 노출수가 발생하지 않을 것이라고 보장할 수 없기 때문입니다. 변경할 수 없습니다 대신 Kotlinx 변경 불가능한 컬렉션을 사용할 수 있습니다. 클래스에 @Immutable 또는 @Stable로 주석을 답니다.
  • 기타 모듈: Compose는 항상 출처가 불안정하다고 간주합니다. Compose 컴파일러가 실행되지 않는 모듈 UI에서 클래스 래핑 사용할 수 있습니다

추가 자료