Thời gian chạy Compose

Các khối xây dựng cơ bản cho mô hình lập trình và tính năng quản lý trạng thái của Compose, cũng như thời gian chạy cốt lõi để Plugin Composer tiêu chuẩn.
Cập nhật mới nhất Bản phát hành ổn định Bản phát hành dùng thử Bản phát hành beta Bản phát hành alpha
Ngày 18 tháng 5 năm 2022 1.1.1 - 1.2.0-beta02 -

Cấu trúc

Compose là sự kết hợp của 7 mã nhận dạng Nhóm Maven (Maven Group Id) trong androidx. Mỗi Nhóm chứa một tập con chức năng mục tiêu, và mỗi tập con có một bộ ghi chú phát hành riêng.

Bảng này giải thích các nhóm và đường liên kết đến từng bộ ghi chú phát hành.

NhómMô tả
compose.animationTạo ảnh động trong các ứng dụng Jetpack Compose để làm phong phú trải nghiệm người dùng.
compose.compilerBiến đổi các hàm @Composable và hỗ trợ hoạt động tối ưu hoá bằng trình biên dịch bổ trợ Kotlin.
compose.foundationViết ứng dụng Jetpack Compose bằng các khối dựng có sẵn, cũng như mở rộng nền tảng để xây dựng các thành phần của hệ thống thiết kế của riêng bạn.
compose.materialXây dựng các giao diện người dùng Compose Jetpack bằng các thành phần Material Design có sẵn. Đây là điểm truy cập cấp cao hơn của Compose, được thiết kế nhằm cung cấp các thành phần theo như mô tả trên trang web www.material.io.
compose.material3Xây dựng giao diện người dùng Jetpack Compose bằng các thành phần Material Design 3, phiên bản cải tiến tiếp theo của Material Design. Material 3 có giao diện cập nhật, cũng như các thành phần và tính năng cá nhân hoá Material You, chẳng hạn như màu động. Công cụ này được thiết kế để phù hợp với phong cách đồ hoạ và giao diện người dùng hệ thống mới trên Android 12.
compose.runtimeCác khối dựng cơ bản cho mô hình lập trình và tính năng quản lý trạng thái của Compose, đồng thời là thời gian chạy cốt lõi để trình biên dịch bổ trợ Compose nhắm đến.
compose.uiCác thành phần cơ bản của giao diện người dùng Compose cần thiết để tương tác với thiết bị, bao gồm cả bố cục, bản vẽ và phương thức nhập.

Khai báo phần phụ thuộc

Để thêm một phần phụ thuộc trên Compose, bạn phải thêm kho lưu trữ Google Maven vào dự án. Đọc nội dung Kho lưu trữ Maven của Google để biết thêm thông tin.

Thêm các phần phụ thuộc cho cấu phần phần mềm bạn cần trong tệp build.gradle cho ứng dụng hoặc mô-đun:

Groovy

dependencies {
    implementation "androidx.compose.runtime:runtime:1.2.0-alpha08"
    implementation "androidx.compose.runtime:runtime-livedata:1.2.0-alpha08"
    implementation "androidx.compose.runtime:runtime-rxjava2:1.2.0-alpha08"
}

android {
    buildFeatures {
        compose true
    }

    composeOptions {
        kotlinCompilerExtensionVersion = "1.2.0-alpha08"
    }

    kotlinOptions {
        jvmTarget = "1.8"
    }
}

Kotlin

dependencies {
    implementation("androidx.compose.runtime:runtime:1.2.0-alpha08")
    implementation("androidx.compose.runtime:runtime-livedata:1.2.0-alpha08")
    implementation("androidx.compose.runtime:runtime-rxjava2:1.2.0-alpha08")
}

android {
    buildFeatures {
        compose = true
    }

    composeOptions {
        kotlinCompilerExtensionVersion = "1.2.0-alpha08"
    }

    kotlinOptions {
        jvmTarget = "1.8"
    }
}

Để biết thêm thông tin về các phần phụ thuộc, hãy xem bài viết Thêm phần phụ thuộc vào bản dựng.

Ý kiến phản hồi

Ý kiến phản hồi của bạn có thể giúp chúng tôi cải thiện Jetpack. Hãy cho chúng tôi biết nếu bạn phát hiện lỗi mới hoặc có ý tưởng cải thiện thư viện này. Vui lòng xem các lỗi hiện có trong thư viện này trước khi báo một lỗi mới. Bạn có thể thêm lượt bình chọn cho lỗi hiện có bằng cách nhấp vào nút dấu sao.

Báo lỗi mới

Xem tài liệu về công cụ theo dõi lỗi để biết thêm thông tin.

Phiên bản 1.2

Phiên bản 1.2.0-beta02

Ngày 18 tháng 5 năm 2022

Phát hành androidx.compose.runtime:runtime-*:1.2.0-beta02. Phiên bản 1.2.0-beta02 bao gồm các thay đổi sau.

Phiên bản 1.2.0-beta01

Ngày 11 tháng 5 năm 2022

Phát hành androidx.compose.runtime:runtime-*:1.2.0-beta01. Phiên bản 1.2.0-beta01 bao gồm các thay đổi sau.

Tính năng mới

  • Đây là bản phát hành beta 1.2 đầu tiên!

Thay đổi API

  • Đã thêm thử nghiệm Snapshot.unsafeEnter/unsafeLeave (I108f3)
  • Đã thêm API Snapshot.asContextElement() thử nghiệm (Iff072)
  • Hiện tại, bạn có thể dùng chú thích @ComposableTarget và chú thích được đánh dấu @ComposableTargetMarker trong phạm vi tệp bằng cách sử dụng tiền tố @file. Việc sử dụng chú thích mục tiêu ở phạm vi tệp sẽ khiến trình biên dịch giả định tất cả các hàm có khả năng kết hợp trong tệp đều hướng mục tiêu đến ứng dụng liên kết. Ví dụ: việc sử dụng @file:UiComposable sẽ khai báo rằng tất cả các hàm @Composable đều nhắm mục tiêu đến ứng dụng Giao diện người dùng trong Compose. Một hàm khi nhắm mục tiêu đến ứng dụng khác phải cung cấp rõ ràng chú thích điểm đánh dấu mục tiêu mà ứng dụng mong muốn. (I40804)

Phiên bản 1.2.0-alpha08

Ngày 20 tháng 4 năm 2022

Phát hành androidx.compose.runtime:runtime-*:1.2.0-alpha08. Phiên bản 1.2.0-alpha08 bao gồm các thay đổi sau.

Thay đổi API

  • Đã thêm TracingInProgress vào giao diện CompositionTracer. (Ic6f12)
  • Thêm recomposeScopeIdentity vào Composer (I0c873)
  • Các API theo dõi bị hạn chế (Composer.setTracer) với OptIn(InternalComposeTracingApi). (I9187f)
  • Thêm ResuableContentHost cho phép kiểm soát tốt hơn thời gian hoạt động của trạng thái được tạo cho nội dung có thể sử dụng lại. Ví dụ: nếu một thành phần phụ tạm thời không được sử dụng, thì nội dung có thể bị vô hiệu hoá khiến mọi trạng thái đã nhớ trong thành phần bị lãng quên, chẳng hạn như tất cả hiệu ứng dùng một lần. (I2c0f2, b/220322704)

Phiên bản 1.2.0-alpha07

Ngày 6 tháng Tư, 2022

Phát hành androidx.compose.runtime:runtime-*:1.2.0-alpha07. Phiên bản 1.2.0-alpha07 bao gồm các thay đổi sau.

Thay đổi API

  • Đã thêm hàm mới Snapshot.withoutReadObservation { ... }. Tính năng này cho phép người dùng chạy hàm lambda đã truyền mà không cần phải đăng ký các thay đổi về giá trị trạng thái đã đọc trong khối này. Bạn có thể thấy hữu ích đối với các trường hợp khi bạn muốn hưởng lợi từ việc đọc/ghi an toàn theo chuỗi ảnh chụp nhanh, nhưng cũng muốn có thể đọc giá trị này mà không cần quá trình ghi lại hoặc đo lường lại không cần thiết. (I9f365, b/214054486)

Phiên bản 1.2.0-alpha06

Ngày 23 tháng Ba, 2022

Phát hành androidx.compose.runtime:runtime-*:1.2.0-alpha06. Phiên bản 1.2.0-alpha06 bao gồm các thay đổi sau.

Phiên bản 1.2.0-alpha05

Ngày 9 tháng 3 năm 2022

Phát hành androidx.compose.runtime:runtime-*:1.2.0-alpha05. Phiên bản 1.2.0-alpha05 bao gồm các thay đổi sau.

Đóng góp bên ngoài

  • Cập nhật để sử dụng Kotlinx coroutines 1.6.0 (I3366d)

Phiên bản 1.2.0-alpha04

Ngày 23 tháng 2 năm 2022

Phát hành androidx.compose.runtime:runtime-*:1.2.0-alpha04. Phiên bản 1.2.0-alpha04 bao gồm các thay đổi sau.

Thay đổi API

  • Đã thêm ComposableTarget, ComposableTargetMarkerComposableOpenTarget cho phép biên dịch báo cáo thời gian về khi một hàm có khả năng kết hợp được gọi là nhắm mục tiêu một ứng dụng khác mà tính năng này không được thiết kế để sử dụng.

    Trong hầu hết các trường hợp, trình biên dịch bổ trợ của Compose có thể dự đoán các chú thích. Do đó, hiếm khi sử dụng trực tiếp các chú thích này. Các trường hợp không thể dự đoán được bao gồm việc tạo và sử dụng các hàm có khả năng kết hợp, trừu tượng, áp dụng tuỳ chỉnh (chẳng hạn như phương thức giao diện), các trường hoặc biến toàn cục là các biểu thức lambda của thành phần kết hợp (biến và thông số cục bộ được dự đoán), hoặc khi sử dụng ComposeNode hoặc hàm có khả năng kết hợp liên quan.

    Đối với các ứng dụng tuỳ chỉnh, các hàm có khả năng kết hợp có thể gọi ComposeNode hoặc ReusableComposeNode cần thêm chú thích CompoableTarget cho hàm đó và mọi loại thông số lambda của thành phần kết hợp. Tuy nhiên, bạn nên tạo chú thích được chú thích với ComposableTargetMarker, sau đó sử dụng chú thích được đánh dấu trực tiếp thay cho ComposableTarget. Một chú thích của thành phần kết hợp được đánh dấu bằng ComposableTargetMarker tương đương với ComposbleTarget có tên đủ điều kiện của loại thuộc tính là thông số ứng dụng. Để xem ví dụ về cách sử dụng ComposableTargetMarker, vui lòng xem anroidx.compose.ui.UiComposable. (I38f11)

Phiên bản 1.2.0-alpha03

Ngày 9 tháng 2 năm 2022

Phát hành androidx.compose.runtime:runtime-*:1.2.0-alpha03. Phiên bản 1.2.0-alpha03 bao gồm các thay đổi sau.

Thay đổi API

  • Đã thêm movableContentOf chuyển đổi Lambda có thể kết hợp thành một Lambda di chuyển trạng thái và các nút tương ứng, sang bất kỳ vị trí mới nào mà nó được gọi. Khi lệnh gọi trước rời khỏi thành phần, trạng thái sẽ được lưu giữ tạm thời và nếu một lệnh gọi mới đến lambda nhập vào thành phần thì trạng thái và các nút liên quan sẽ được chuyển đến vị trí của lệnh gọi mới. Nếu không có cuộc gọi mới nào được thêm, trạng thái sẽ bị xoá vĩnh viễn và hãy nhớ rằng những người quan sát sẽ được thông báo.

    Nếu hệ thống gọi movableContentOf lambda trong nhiều lần trong cùng một thành phần, thì trạng thái mới và các nút sẽ được tạo cho mỗi lệnh gọi. Khi các lệnh gọi rời khỏi thành phần và các lệnh gọi mới nhập vào, trạng thái đó sẽ bị di chuyển từ lần đầu tiên thoát cuộc gọi đến cuộc gọi nhập theo thứ tự chúng được gọi. Tất cả trạng thái không được xác nhận quyền sở hữu bởi các cuộc gọi mới sẽ bị xoá vĩnh viễn. (Ib4850)

  • Thêm API theo dõi vào thành phần để hỗ trợ các công cụ cung cấp dữ liệu truy vết chi tiết hơn về các hàm có khả năng kết hợp. Trình biên dịch hiện tạo các lệnh gọi đến API theo dõi, trong đó có thông tin nguồn. (Ib0eb5)

    Để xoá các lệnh gọi này và thông tin nguồn liên quan khỏi bản phát hành, hãy thêm quy tắc Proguard sau:

      -assumenosideeffects public class androidx.compose.runtime.ComposerKt {
          boolean isTraceInProgress();
          void traceEventStart(int,java.lang.String);
          void traceEventEnd();
      }
    
  • Hãy thêm InternalComposeScope để các công cụ có thể xác định thành phần có thể kết hợp trong quá trình kết hợp lại. (I07a3f)

Phiên bản 1.2.0-alpha02

Ngày 26 tháng 1 năm 2022

androidx.compose.runtime:runtime-*:1.2.0-alpha02 đã được phát hành. Phiên bản 1.2.0-alpha02 bao gồm các thay đổi sau.

Phiên bản 1.2.0-alpha01

Ngày 12 tháng 1 năm 2022

androidx.compose.runtime:runtime-*:1.2.0-alpha01 đã được phát hành. Phiên bản 1.2.0-alpha01 bao gồm các thay đổi sau.

Thay đổi API

  • Đã thêm trường identity vào CompositionData để tạo mã biến thể trong Layout Inspector. (Ic116e)

Thông tin cập nhật phần phụ thuộc

  • Giờ phụ thuộc vào Kotlin 1.6.10.

Phiên bản 1.1

Phiên bản 1.1.1

Ngày 23 tháng 2 năm 2022

androidx.compose.runtime:runtime-*:1.1.1 đã được phát hành. Phiên bản 1.1.1 bao gồm các thay đổi sau.

Sửa lỗi

  • Sửa NullPointerException tại androidx.compose.ui.platform.RenderNodeLayer.updateDisplayList (aosp/1947059, b/206677462)
  • Khắc phục sự cố do nội dung trong bảng nhớ tạm gây ra khi đọc từ bảng nhớ tạm trên Android. (I06020, b/197769306)
  • Sửa RTL ở LazyVerticalGrid (aosp/1931080, b/207510535)

Phiên bản 1.1.0

Ngày 9 tháng 2 năm 2022

Phát hành androidx.compose.runtime:runtime-*:1.1.0. Phiên bản 1.1.0 bao gồm các thay đổi sau.

Thay đổi quan trọng kể từ phiên bản 1.0.0

  • Hỗ trợ ổn định cho Hiệu ứng cuộn quá mức của Android 12
  • Những cải tiến đối với kích thước đích nhấn
  • Lưu ý rằng đối với phiên bản Compose 1.0, các thành phần Material sẽ mở rộng không gian bố cục để đáp ứng các nguyên tắc hỗ trợ tiếp cận Material cho kích thước mục tiêu cảm ứng Ví dụ: mục tiêu cảm ứng của nút sẽ mở rộng đến kích thước tối thiểu là 48x48dp, ngay cả khi bạn đặt kích thước Nút nhỏ hơn. Điều này giúp căn chỉnh Compose Material phù hợp với hành vi của Thành phần Material Design, tạo ra hành vi nhất quán khi kết hợp Chế độ xem và Compose. Thay đổi này cũng đảm bảo rằng khi bạn tạo giao diện người dùng bằng các thành phần Compose Material, các yêu cầu tối thiểu về hỗ trợ tiếp cận đích nhấn sẽ được đáp ứng.
  • Hỗ trợ ổn định cho Dải điều hướng (Navigation Rail)
  • Ổn định một số API thử nghiệm trước đây
  • Hỗ trợ các phiên bản Kotlin mới hơn

Phiên bản 1.1.0-rc03

Ngày 26 tháng 1 năm 2022

androidx.compose.runtime:runtime-*:1.1.0-rc03 đã được phát hành. Phiên bản 1.1.0-rc03 bao gồm các thay đổi sau.

Sửa lỗi

  • Cập nhật để hỗ trợ Tài liệu soạn 1.1.0-rc03

Phiên bản 1.1.0-rc01

Ngày 15 tháng 12 năm 2021

androidx.compose.runtime:runtime-*:1.1.0-rc01 đã được phát hành. Phiên bản 1.1.0-rc01 bao gồm các thay đổi sau.

Phiên bản 1.1.0-beta04

Ngày 1 tháng 12 năm 2021

androidx.compose.runtime:runtime-*:1.1.0-beta04 đã được phát hành. Phiên bản 1.1.0-beta04 bao gồm các thay đổi sau.

Tính năng mới

  • Cập nhật để tương thích với 1.6.0 Kotlin

Phiên bản 1.1.0-beta03

Ngày 17 tháng 11 năm 2021

androidx.compose.runtime:runtime-*:1.1.0-beta03 đã được phát hành. Phiên bản 1.1.0-beta03 bao gồm các thay đổi sau.

Phiên bản 1.1.0-beta02

Ngày 3 tháng 11 năm 2021

androidx.compose.runtime:runtime-*:1.1.0-beta02 đã được phát hành. Phiên bản 1.1.0-beta02 bao gồm các thay đổi sau.

Thay đổi API

  • Mã ảnh chụp nhanh được chia thành nhiều tệp, nhưng tất cả vẫn tồn tại trong cùng một loại VM. (Ic6c98)

Phiên bản 1.1.0-beta01

Ngày 27 tháng 10 năm 2021

androidx.compose.runtime:runtime-*:1.1.0-beta01 đã được phát hành. Phiên bản 1.1.0-beta01 bao gồm các thay đổi sau.

Phiên bản 1.1.0-alpha06

Ngày 13 tháng 10 năm 2021

androidx.compose.runtime:runtime-*:1.1.0-alpha06 đã được phát hành. Phiên bản 1.1.0-alpha06 bao gồm các thay đổi sau.

Thay đổi API

  • Đã xoá bỏ InternalCompilerApi khỏi các Phương thức soạn bắt buộc phải được gọi mô-đun chéo (I1aa0b)
  • Recomposer.state không được dùng nữa và được thay thế bằng Recomposer.currentState để thay đổi loại mã thành StateFlow (Ic2ab3, b/197773820)

Phiên bản 1.1.0-alpha05

Ngày 29 tháng 9 năm 2021

androidx.compose.runtime:runtime-*:1.1.0-alpha05 đã được phát hành. Phiên bản 1.1.0-alpha05 bao gồm các thay đổi sau.

Phiên bản 1.1.0-alpha04

Ngày 15 tháng 9 năm 2021

androidx.compose.runtime:runtime-*:1.1.0-alpha04 đã được phát hành. Phiên bản 1.1.0-alpha04 bao gồm các thay đổi sau.

Phiên bản 1.1.0-alpha03

Ngày 1 tháng 9 năm 2021

androidx.compose.runtime:runtime-*:1.1.0-alpha03 đã được phát hành. Phiên bản 1.1.0-alpha03 bao gồm các thay đổi sau.

Tính năng mới

  • Trình biên dịch soạn thư hiện hỗ trợ các phiên bản Thời gian chạy soạn thư cũ (1.0). Trước đó, Trình biên dịch soạn thư chỉ tương thích với Thời gian chạy soạn thư của cùng phiên bản trở lên. Sau khi thay đổi này, Trình biên dịch soạn thư tương thích với phiên bản cũ hơn của Thời gian chạy soạn (1.0). (aosp/1796968)
  • Cập nhật Compose 1.1.0-alpha03 để phụ thuộc vào Kotlin 1.5.30. (I74545)

Phiên bản 1.1.0-alpha02

Ngày 18 tháng 8 năm 2021

androidx.compose.runtime:runtime-*:1.1.0-alpha02 đã được phát hành. Phiên bản 1.1.0-alpha02 bao gồm các thay đổi sau.

Phiên bản 1.1.0-alpha01

Ngày 4 tháng 8 năm 2021

androidx.compose.runtime:runtime-*:1.1.0-alpha01 đã được phát hành. Phiên bản 1.1.0-alpha01 bao gồm các thay đổi sau.

Phiên bản 1.0

Phiên bản 1.0.5

Ngày 3 tháng 11 năm 2021

androidx.compose.runtime:runtime-*:1.0.5 đã được phát hành. Phiên bản 1.0.5 bao gồm các thay đổi sau.

Sửa lỗi

  • Khắc phục sự cố theo dõi các phiên bản derivedStateOf. (aosp/1792247)

Phiên bản 1.0.4

Ngày 13 tháng 10 năm 2021

androidx.compose.runtime:runtime-*:1.0.4 đã được phát hành. Phiên bản 1.0.4 bao gồm các thay đổi sau.

Thông tin cập nhật về phần phụ thuộc

  • Cập nhật để phụ thuộc vào Kotlin 1.5.31

Phiên bản 1.0.3

Ngày 29 tháng 9 năm 2021

androidx.compose.runtime:runtime-*:1.0.3 đã được phát hành. Phiên bản 1.0.3 bao gồm các thay đổi sau.

Thông tin cập nhật về phần phụ thuộc

  • Cập nhật để phụ thuộc vào Kotlin 1.5.30

Phiên bản 1.0.2

Ngày 1 tháng 9 năm 2021

Phát hành androidx.compose.runtime:runtime-*:1.0.2. Phiên bản 1.0.2 bao gồm các thay đổi sau.

Cập nhật để hỗ trợ bản phát hành Compose 1.0.2. Compose 1.0.2 vẫn tương thích với Kotlin 1.5.21.

Phiên bản 1.0.1

Ngày 4 tháng 8 năm 2021

androidx.compose.runtime:runtime-*:1.0.1 đã được phát hành. Phiên bản 1.0.1 bao gồm các thay đổi sau.

Thông tin cập nhật về phần phụ thuộc

  • Cập nhật để phụ thuộc vào Kotlin 1.5.21.

Phiên bản 1.0.0

Ngày 28 tháng 7 năm 2021

androidx.compose.runtime:runtime-*:1.0.0 đã được phát hành. Phiên bản 1.0.0 bao gồm các thay đổi sau.

Các tính năng chính của phiên bản 1.0.0

Đây là bản phát hành chính thức đầu tiên của ứng dụng Compose. Vui lòng xem blog về Bản phát hành Compose chính thức để biết thêm thông tin chi tiết!

Lỗi đã biết

  • Nếu đang sử dụng Android Studio Bumblebee Canary 4 hoặc AGP 7.1.0-alpha04/7.1.0-alpha05, bạn có thể gặp sự cố sau đây:

      java.lang.AbstractMethodError: abstract method "void androidx.lifecycle.DefaultLifecycleObserver.onCreate(androidx.lifecycle.LifecycleOwner)"
    

    Để khắc phục, hãy tạm thời tăng minSdkVersion lên 24+ trong tệp build.gradle. Sự cố này sẽ được khắc phục trong phiên bản tiếp theo của Android Studio Bumblebee và AGP 7.1. (b/194289155)

Phiên bản 1.0.0-rc02

Ngày 14 tháng 7 năm 2021

androidx.compose.runtime:runtime-*:1.0.0-rc02 đã được phát hành. Phiên bản 1.0.0-rc02 bao gồm các thay đổi sau.

  • Đã khắc phục các tình trạng chủng trong muteStateObserver gây ra NullPointerExceptions. (aosp/1763445, aosp/1758105, b/192677711)
  • Khắc phục các vấn đề xảy ra với ảnh chụp nhanh thời gian chạy gây ra java.lang.IllegalStateException: Reading a state that was created after the snapshot was taken or in a snapshot that has not yet been applied sự cố. (b/193006595, b/192570897)

Phiên bản 1.0.0-rc01

Ngày 1 tháng 7 năm 2021

androidx.compose.runtime:runtime-*:1.0.0-rc01 đã được phát hành. Phiên bản 1.0.0-rc01 bao gồm các thay đổi sau.

Phiên bản 1.0.0-beta09

Ngày 16 tháng 6 năm 2021

androidx.compose.runtime:runtime-*:1.0.0-beta09 đã được phát hành. Phiên bản 1.0.0-beta09 bao gồm các thay đổi sau.

Các quy tắc bổ sung cho hồ sơ

Bản phát hành này bổ sung các quy tắc hồ sơ cho những mô-đun Compose sau (I14ed6):

  • androidx.compose.animation
  • androidx.compose.animation-core
  • androidx.compose.foundation
  • androidx.compose.foundation-layout
  • androidx.compose.material
  • androidx.compose.material-ripple
  • androidx.compose.runtime
  • androidx.compose.ui
  • androidx.compose.ui.geometry
  • androidx.compose.ui.graphics
  • androidx.compose.ui.text
  • androidx.compose.ui.text
  • androidx.compose.ui.unit
  • androidx.compose.ui.util

Quy tắc hồ sơ là gì?

  • Quy tắc hồ sơ cho thư viện được chỉ định trong tệp văn bản baseline-prof.txt nằm trong src/main hoặc thư mục tương đương. Tệp này chỉ định quy tắc trên mỗi dòng, trong đó quy tắc trong trường hợp này là mẫu để khớp với phương thức hoặc lớp trong thư viện. Cú pháp cho các quy tắc này là tập mẹ của định dạng hồ sơ ART mà con người có thể đọc được, được dùng khi sử dụng adb shell profman --dump-classes-and-methods .... Các quy tắc này dùng một trong hai biểu mẫu để nhắm mục tiêu vào phương thức hoặc lớp.

  • Quy tắc phương thức sẽ có mẫu sau:

    <FLAGS><CLASS_DESCRIPTOR>-><METHOD_SIGNATURE>
    
  • Và quy tắc lớp sẽ có mẫu sau:

    <CLASS_DESCRIPTOR>
    
  • Ở đây <FLAGS> có một hoặc nhiều ký tự H, SP để cho biết phương thức này có nên được gắn cờ là "Hot", "Startup" hoặc "Post Startup" hay không.

  • <CLASS_DESCRIPTOR> là phần mô tả cho lớp chứa phương thức được nhắm mục tiêu. Ví dụ: lớp androidx.compose.runtime.SlotTable sẽ có phần mô tả là Landroidx/compose/runtime/SlotTable;.

  • <METHOD_SIGNATURE> là chữ ký của phương thức và bao gồm tên, loại thông số và loại dữ liệu trả về của phương thức. Ví dụ: phương thức fun isPlaced(): Boolean trên LayoutNode có chữ ký isPlaced()Z.

  • Những mẫu này có thể có ký tự đại diện (**, *?) để có một quy tắc đơn lẻ bao gồm nhiều phương thức hoặc lớp.

Những quy tắc này có chức năng gì?

  • Phương thức có cờ H cho biết rằng phương thức này là một phương thức "khởi động nóng" và phải được biên dịch trước.

  • Phương thức có cờ S cho biết rằng đây là phương thức được gọi khi khởi động và phải được biên dịch trước để tránh chi phí biên dịch và diễn giải phương thức này tại thời điểm khởi động.

  • Phương thức có cờ P cho biết rằng đây là phương thức được gọi sau khi khởi động.

  • Một lớp có trong tệp này cho biết rằng lớp này được dùng trong khi khởi động và cần được phân bổ trước trong vùng nhớ khối xếp để tránh chi phí tải lớp.

Cơ chế này hoạt động như thế nào?

  • Thư viện có thể xác định những quy tắc sẽ được đóng gói trong cấu phần mềm AAR. Khi một ứng dụng được tạo bao gồm các cấu phần mềm này, các quy tắc này được hợp nhất với nhau và các quy tắc hợp nhất được dùng để tạo ra một hồ sơ ART nhị phân nhỏ gọn dành riêng cho ứng dụng. ART sau đó có thể tận dụng hồ sơ này khi ứng dụng được cài đặt trên thiết bị để biên dịch trước một tập hợp con cụ thể của ứng dụng nhằm cải thiện hiệu suất của ứng dụng, đặc biệt là lần chạy đầu tiên. Lưu ý rằng việc này sẽ không ảnh hưởng đến các ứng dụng có thể gỡ lỗi.

Phiên bản 1.0.0-beta08

Ngày 2 tháng 6 năm 2021

androidx.compose.runtime:runtime-*:1.0.0-beta08 đã được phát hành. Phiên bản 1.0.0-beta08 bao gồm các thay đổi sau.

Thay đổi API

  • State<T> hiện là State<out T> (I69049)
  • Sự thay đổi về API của ControlledComposition để cho phép thực hiện các thay đổi trong một lần chuyển đổi duy nhất. (Iaafd1, b/184173932)

Phiên bản 1.0.0-beta07

Ngày 18 tháng 5 năm 2021

androidx.compose.runtime:runtime-*:1.0.0-beta07 đã được phát hành. Phiên bản 1.0.0-beta07 bao gồm các thay đổi sau.

Thay đổi API

  • Thêm các API trình biên dịch soạn thư mới cho phép xoá thông tin nguồn do trình biên dịch tạo trong quá trình giảm kích thước nguồn. (Ia34e6)
  • Giới thiệu ReusableContent sẽ cố gắng sử dụng lại các nút trong nội dung của thay vì thay thế các nút khi khoá được thay đổi. Khi khoá được thay đổi, các giá trị trước đó trong bảng vùng cho nội dung sẽ bị bỏ qua ngoại trừ các nút đã được tạo và các giá trị dùng để cập nhật các nút.

    Giới thiệu ReusableComposeNode sẽ sử dụng lại nút đã phát hành thay vì thay thế nút này như được thực hiện cho ComposeNode. (I1dd86)

  • @ComposeCompilerApi không còn @RequiresOptIn (Iab690)

Sửa lỗi

  • Giờ đây, LazyColumn/Row sẽ giữ tới 2 mục hiển thị trước đây đang hoạt động (chưa được xử lý), ngay cả khi đã bỏ tính năng cuộn của chúng. Điều này cho phép thành phần đó sử dụng lại các bố cục phụ đang hoạt động khi chúng ta cần kết hợp một mục mới để cải thiện hiệu suất của tính năng cuộn. (Ie5555)

Phiên bản 1.0.0-beta06

Ngày 5 tháng 5 năm 2021

androidx.compose.runtime:runtime-*:1.0.0-beta06 đã được phát hành. Phiên bản 1.0.0-beta06 bao gồm các thay đổi sau.

Thay đổi API

  • @ComposeCompilerApi không còn @RequiresOptIn (Iab690)

Phiên bản 1.0.0-beta05

Ngày 21 tháng 4 năm 2021

androidx.compose.runtime:runtime-*:1.0.0-beta05 đã được phát hành. Phiên bản 1.0.0-beta05 bao gồm các thay đổi sau.

Thay đổi API

  • Đã xoá@InternalComposeApi để ghi và đọc bản ghi nhanh (Id134d)

Sửa lỗi

  • Các tệp AndroidManifest từ ui-test- Manifest và ui-tooling-data hiện đã tương thích với Android 12 (I6f9de, b/184718994)

Phiên bản 1.0.0-beta04

Ngày 7 tháng 4 năm 2021

androidx.compose.runtime:runtime-*:1.0.0-beta04 đã được phát hành. Phiên bản 1.0.0-beta04 bao gồm các thay đổi sau.

Sửa lỗi

  • Trước khi có thay đổi này, có thể bỏ qua các hàm có khả năng kết hợp cục bộ dựa trên tham số của chúng. Sau khi có sự thay đổi này, không bỏ qua được các hàm có khả năng kết hợp cục bộ. Thay đổi này được thực hiện vì nó phổ biến và có thể xảy ra việc các hàm cục bộ nắm bắt được các thông số từ thành phần mẹ và việc bỏ qua chúng là một nguồn lỗi phổ biến.

    Để tóm tắt, hãy xem ví dụ:

    @Composable fun Counter(count: Int, onCountChange: (Int) -> Unit) {
      @Composable fun ShowCount() { Text("Count: $count") }
      ShowCount()
      Button(onClick={ onCountChange(count + 1) }) {
        Text("Increment")
      }
    }
    

    Trước khi có sự thay đổi này, hàm ShowCount có khả năng kết hợp sẽ luôn bỏ qua, ngay cả sau khi bạn cập nhật thông số count. Hiện tại chúng tôi đã có một số thay đổi. (I5648a)

  • Khắc phục vấn đề khi rememberSaveable() khôi phục giá trị cũ khi được dùng với các thông số đầu vào (I1b110, b/182403380)

Phiên bản 1.0.0-beta03

Ngày 24 tháng 3 năm 2021

androidx.compose.runtime:runtime-*:1.0.0-beta03 đã được phát hành. Phiên bản 1.0.0-beta03 bao gồm các thay đổi sau.

Thay đổi API

  • Ngừng sử dụng DefaultMonotonicFrameClock. Việc gọi withFrameNanos hoặc Recomposer.runRecomposeAndApplyChanges không có MonotonicFrameClock hiện sẽ loại IllegalStateException. (I4eb0d)

Phiên bản 1.0.0-beta02

Ngày 10 tháng 3 năm 2021

androidx.compose.runtime:runtime-*:1.0.0-beta02 đã được phát hành. Phiên bản 1.0.0-beta02 bao gồm các thay đổi sau.

Sửa lỗi

  • Thực thi các hạn chế về việc sử dụng công khai API thử nghiệm (I6aa29, b/174531520)
  • Sửa lỗi cho rememberSaveable { mutableStateOf(0) } bị hỏng khi sử dụng bên trong một vị trí tổng hợp. (I1312b, b/180042685, b/180701630)

Phiên bản 1.0.0-beta01

Ngày 24 tháng 2 năm 2021

androidx.compose.runtime:runtime-*:1.0.0-beta01 đã được phát hành. Phiên bản 1.0.0-beta01 bao gồm các thay đổi sau.

Đây là bản phát hành đầu tiên của Compose 1.0.0 Beta.

Thay đổi API

  • Thêm API thử nghiệm Recomposer.runRecomposeConcurrentlyAndApplyChanges để kết hợp lại các thành phần đã hết hiệu lực ngoài vòng lặp khung chính. (I342d0)
  • Bất kỳ tác phẩm sáng tác nào được đánh dấu @ReadOnlyComposable hiện đều được xác thực tại thời điểm biên dịch để đảm bảo rằng chúng chỉ thực hiện các lệnh gọi đến @ReadOnlyComposables (I58961) khác
  • Bạn hiện bắt buộc phải cung cấp defaultFactory cho compositionLocalOfstaticCompositionLocalOf thay vì không bắt buộc.

    Thay đổi này sẽ xoá lỗi loại có thể xảy ra đối với các loại không thể rỗng nếu bạn chưa cung cấp trạng thái ban đầu mặc định. Trước đây điều này sẽ cung cấp một tham chiếu rỗng cho loại không thể rỗng.

    Đối với các loại giá trị rỗng, hãy cân nhắc cung cấp { null } làm giá trị mặc định.

    Chúng tôi khuyên bạn không nên sử dụng các bộ lọc có loại không thể rỗng trừ khi có thể cung cấp giá trị mặc định hợp lý. Nếu không có giá trị mặc định hợp lý, hệ thống defaultFactory sẽ tạo ngoại lệ. Tuy nhiên việc loại bỏ một trường hợp ngoại lệ có nghĩa là người tiêu dùng tại địa phương sẽ có phần phụ thuộc ngầm định cung cấp mà hệ thống loại này không thực thi. (Ifbd2a)

  • Đã xoá các biểu tượng không còn được dùng khỏi thời gian chạy khi soạn thư (I3252c)

  • emptyContent() không dùng được nữa đã bị xoá. Thay vào đó, hãy sử dụng {}. (Idb33f, b/179432510)

  • Nhà cung cấp đã được đổi tên thành CompositionLocalProvider

    • Hàm tạo Bản sáng tác không còn chấp nhận một thông số chính và đã ngừng hoạt động.
    • currentCompositeKeyHash đã được chuyển thành thuộc tính cấp cao nhất của thành phần kết hợp thay vì hàm cấp cao nhất của thành phần kết hợp.
    • CompositionData và CompositionGroup đã được chuyển sang không gian tên androidx.compose.runtime.tooling
    • ComposableLambda đã được đặt thành một giao diện thay vì loại cụ thể, và không còn có các thông số loại nữa.
    • ComposableLambdaN đã được đặt thành giao diện thay vì loại cụ thể, và không còn có thông số loại nữa.
    • Hàm snapshotFlow đã được di chuyển sang không gian tên androidx.compose.runtime
    • phương pháp hợp nhất của SnapshotMutationPolicy không còn là thử nghiệm nữa
    • Hàm @TestOnly clearRoots cấp cao nhất đã bị xoá. Dữ liệu này không còn cần thiết nữa.
    • Các hàm keySourceInfoOf và resetSourceInfo đã bị xoá. Các dữ liệu này không còn cần thiết nữa.
    • Composer.collectKeySourceInformation đã bị xoá. Dữ liệu này không còn cần thiết nữa.
    • Các phương thức isJoinedKey, joinedKeyLeft và joinedKeyRight đã bị xoá. Các dữ liệu này không còn cần thiết nữa.
    • Nhiều API cấp cao nhất đã được di chuyển và sắp xếp lại thành các tệp khác nhau. Do ngữ nghĩa lớp tệp Kotlin, khả năng tương thích nhị phân sẽ bị phá vỡ chứ không phải khả năng tương thích nguồn, do đó đây không phải là vấn đề đối với hầu hết người dùng.
    • (I99b7d, b/177245490)
  • SnapshotStateObserver không còn là Thử nghiệm nữa (Id2e6a)

  • Đã xoá một số API không dùng nữa (Ice5da, b/178633932)

  • Thực hiện các thay đổi sau với API Material:

    • Đã thêm thông số contentPadding vào Top/BottomAppBar để cho phép tuỳ chỉnh khoảng đệm mặc định.
    • Các thông số được sắp xếp lại trong BackdropScaffold để tuân thủ các nguyên tắc của API đối với những thông số bắt buộc đứng trước thông số không bắt buộc.
    • Đã di chuyển thông số icon trong BottomNavigationItem sang phía sau selectedonClick.
    • Đã đổi tên thông số alwaysShowLabels trong NavigationNavigationItem thành alwaysShowLabel.
    • Đã đổi tên thông số bodyContent trong một vài thành phần thành chỉ content.
    • Sắp xếp lại các thông số trong ButtonDefaults.buttonColors(). Xin lưu ý rằng vì loại thông số này không thay đổi, nên mã này sẽ không gây ra lỗi. Hãy đảm bảo bạn đang sử dụng các thông số có tên hoặc cập nhật thứ tự theo cách thủ công, nếu không thì mã của bạn sẽ không hoạt động như trước.
    • Thêm thông số secondaryVariant vào darkColors(). Màu này thường giống với màu secondary trong giao diện tối, nhưng việc thông số để màu thêm tính nhất quán và tuỳ chỉnh thêm.
    • Đã xoá HeightDefaults và animateElevation() trên giao diện API công khai vì chúng không được sử dụng phổ biến / hữu ích.
    • Đã đổi tên onValueChangeEnd trong Slider thành onValueChangeFinished và đặt thành rỗng.
    • Đã đổi tên thông số text trong Snackbar thành content để đảm bảo tính nhất quán.
    • Đã thêm thông số contentPadding vào DropdownMenuItem để cho phép tuỳ chỉnh khoảng đệm mặc định và đặt content làm phần mở rộng trên RowScope.
    • Đổi tên ModalDrawerLayout thành ModalDrawer.
    • Đổi tên BottomDrawerLayout thành BottomDrawer.
    • (I1cc66)

Phiên bản 1.0.0-alpha12

Ngày 10 tháng Hai, 2021

androidx.compose.runtime:runtime-*:1.0.0-alpha12 đã phát hành. Phiên bản 1.0.0-alpha12 bao gồm các thay đổi sau.

Thay đổi API

  • Tính năng hỗ trợ cho ViewGroups đã bị xoá khỏi UiAppier. Các thành phần kết hợp emitView không được dùng nữa đã bị xoá. (Ifb214)
  • CompositionReference được đổi tên thành CompositionContext (I53fcb)
  • componentActivity.setContent đã chuyển sang androidx.activity.Comose.setContent trong mô-đun androidx.activity:activity- compose. (Icf416)
  • Ảnh chụp nhanh API được cập nhật để phù hợp hơn với nguyên tắc API cũng như ẩn các lớp triển khai nội bộ từ API công khai. (Id9e32)
  • Đã đổi tên Ambients để khớp với Ambient -> Đổi tên CompositionLocal. Ambients trước đây được đặt tên là AmbientFoo, hiện nay CompositionLocals có tên là LocalFoo. (I2d55d)
  • Đã đổi tên Ambient thành CompositionLocal, và ambientOf / staticAmbientOf thành compositionLocalOf / staticCompositionLocalOf theo đúng thứ tự. Thay đổi này giúp làm cho mục đích của CompositionLocal rõ ràng hơn: cơ chế cung cấp / truy xuất các giá trị cục bộ cho một bản soạn. Bản sao CompositionLocal phải có tiền tố là Local, chẳng hạn như val LocalFoo = layoutLocalOf { Foo() }. (Ia55b6)
  • takeMutableSnapshot và TakeSnapshot đã chuyển sang các phương thức đồng hành của trang Tổng quan. (I91f19)
  • @ComposableContract đã ngừng hoạt động và thay vào đó là ba chú thích cụ thể hơn.

    @ComposableContract(restartable = false) đã trở thành @NonRestartableComposable @ComposableContract(readonly = true) đã trở thành @ReadOnlyComposable @ComposableContract(preventCapture = true) đã trở thành @DisallowComposableCalls @ComposableContract(tracked = true) đã bị xoá. (I60a9d)

  • emptyContent() và (@Composable () -> Đơn vị).oroutorororor đã không được dùng nữa vì chúng không còn có bất kỳ tác động hoặc giá trị hiệu suất tích cực nào (I0484d)

  • snapshotFlowwithMutableSnapshot không còn thử nghiệm (I6a45f)

  • Bạn hiện có thể đóng các bộ cấu phần lại. Các thành phần kết hợp lại đã đóng sẽ tiếp tục kết hợp lại cho đến khi hoàn tất quá trình kết hợp lại các coroutine con Recomposer.shutDown được đổi tên để huỷ chế độ tương phản với chế độ đóng. (Ib6d76)

  • Cấu phần của phần mềm compose:runtime-dispatch hiện không còn dùng nữa. Giờ đây, bạn có thể tìm thấy compose:runtime và AndroidUiDispatcher trong compose:ui. (Ib5c36)

  • API mà trình biên dịch Trình soạn thư nhắm mục tiêu đã được tái cấu trúc để sử dụng một giao diện thay vì một loại cụ thể. Giao diện này cũng không còn sử dụng thông số loại.

    Đây là một thay đổi nội bộ sẽ không ảnh hưởng đến khả năng tương thích cho mã nguồn mà là một thay đổi có thể gây lỗi nhị phân. (I3b922, b/169406779)

  • SnapshotMutableState đã được giới thiệu (Icfd03)

  • DisposableEffectDisposable đã được đổi tên thành DisposaleEffectResult (Ica7c6)

  • Đã xoá Recomposer.current(). [Abstract]ComposeView hiện được đặt mặc định là các Trình tạo lại theo từng cửa sổ ở phạm vi cửa sổ do ViewTreeLifecycleOwner cho cửa sổ tạo ra). Quá trình soạn lại và bằng khung đánh dấu hoạt ảnh dựa trên frameNanos sẽ bị tạm dừng trong khi máy chủ Lifecycle ngừng hoạt động. (I38e11)

  • Recomposer.runningRecomposers hiện cung cấp StateFlow toàn cầu của RecomposerInfo chỉ đọc để quan sát trạng thái thành phần đang diễn ra trong quá trình này. Ưu tiên API này hơn Recomposer.current(), hiện không được dùng nữa. (If8ebe)

  • DisposableEffectDisposable được đổi tên thành DisposaleEffectResult (I3ea68)

Phiên bản 1.0.0-alpha11

Ngày 28 tháng Một, 2021

androidx.compose.runtime:runtime-*:1.0.0-alpha11 đã phát hành. Phiên bản 1.0.0-alpha11 bao gồm các thay đổi sau.

Thay đổi API

  • onCommit, onDispose và onActive đã không còn được sử dụng nữa, thay vào đó là các API SideEffect và DisposableEffect (If760e)
  • API emit() và tất cả các trường hợp tải quá tải đều đã ngừng hoạt động và được đổi tên thành ComposeNode. Các API giống hệt nhau, chỉ khác một tên để tuân theo quy ước đặt tên của Compose (I4137b)
  • invalidate và compositionReference() hiện không được dùng nữa và thay vào đó, lần lượt là currentRecomposeScope và rememberCompositionReference. (I583a8)
  • RememberObserver thay thế CompositionLifecycleObserver và CompositionLifecycleObserver hiện đã ngừng hoạt động.

    RememberObserver là sự thay thế cho CompositionLifecycleObserver bằng ngữ nghĩa được sửa đổi và phương thức được đổi tên. Việc thay đổi sang API mới có thể được thực hiện bằng máy móc đối với các đối tượng chỉ được nhớ một lần và tiếp tục là phương pháp được đề xuất. Tuy nhiên, nếu một tệp đối chiếu được nhớ nhiều lần trong một nội dung soạn thảo, thì onRemembered sẽ được gọi cho mỗi tệp đối chiếu mà onEnter chỉ được gọi một lần. onEnter được gọi nhiều lần nếu đối tượng được sử dụng trong các phần phụ, chẳng hạn như WithConstraintsScaffold, giúp đảm bảo rằng một lệnh gọi onEnter không đáng tin cậy và đã bị xoá cho RememberObserver.

    RememberObserver thêm onAbandoned được gọi nếu bản sao RememberObserver được trả về từ lệnh gọi lại chuyển đến remember nhưng không được nhớ ở trạng thái hợp thành và do đó, sẽ không bao giờ onRemembered được gọi. Điều này có thể xảy ra nếu một trường hợp ngoại lệ chấm dứt quan hệ hợp thành trước khi hoàn tất hoặc hợp thành bị huỷ vì trạng thái là đang tạo một quan hệ hợp thành không còn hiệu lực hoặc không còn cần đến nữa. Nếu bản sao của RememberObserver tuân theo một mục đề xuất tham chiếu ở trên là theo dõi một tài nguyên bên ngoài, cả onForgottenonAbandoned, thì mỗi tài nguyên cho biết rằng tài nguyên không còn cần thiết nữa. Nếu đối tượng đang theo dõi công việc đã bắt đầu hoặc tài nguyên được phân bổ trong onRemembered, onAbandoned có thể bị bỏ qua vì đối tượng này sẽ không được gọi nếu onRemembered được gọi. (I02c36)

  • Không đánh dấu các hàm collectAsState() là nội dòng (Ia73e4)

Sửa lỗi

  • WithConstraints đã được thiết kế lại dưới dạng BoxWithIdentifiers và được chuyển sang Foundation.layout. (I9420b, b/173387208)
  • Tận dụng TestCoroutineDispatcher trong thử nghiệm (I532b6)

Phiên bản 1.0.0-alpha10

Ngày 13 tháng Một, 2021

androidx.compose.runtime:runtime-*:1.0.0-alpha10 đã phát hành. Phiên bản 1.0.0-alpha10 bao gồm các thay đổi sau.

Thay đổi có thể gây lỗi

  • Việc sắp xếp lại cấu trúc của API trình biên dịch nội bộ cho phép thay đổi hàng loạt các nút được tạo thành giai đoạn của "áp dụng các thay đổi" của cấu trúc, sau khi tất cả các hàm @Composable đã hoàn tất.

    Đây là thay đổi có thể gây lỗi hành vi có thể ảnh hưởng đến mã ứng dụng vì các nút không còn hoạt động từ API nội bộ và thử nghiệm cho đến khi các thay đổi đã được áp dụng. Bạn thường có thể xử lý vấn đề này bằng cách đặt mã xung quanh các phần phụ thuộc như vậy trong SideEffect có thể so sánh để trì hoãn việc thực thi mã cho đến khi các nút đã được tạo và khởi chạy. (I018da)

Thay đổi API

  • Thêm một cách theo dõi nếu trình kết hợp đã áp dụng các thay đổi. (I1b3e2)
  • Mở rộng [Abstract]ComposeView API để cho phép tái chế Chế độ xem dựa trên Compose, loại bỏ thành phần của chúng để tạo lại sau này. Thêm API để cài đặt và khám phá các thành phần kết hợp lại trong phạm vi cửa sổ và CompositionReferences để tạo thành phần con.

    Thêm ViewCompositionStrategy để định cấu hình chiến lược loại bỏ thành phần của [Abstract]ComposeView; hành vi mặc định được loại bỏ trên tách cửa sổ. (I860ab)

Sửa lỗi

  • Trình kết hợp lại sẽ hiển thị Luồng trạng thái hiện tại của chiến dịch, cho phép theo dõi hoạt động và hoạt động của các hiệu ứng liên quan. (Ifb2b9)
  • Giờ đây, bạn có thể truy cập vào keyEvent gốc thông qua keyEvent.nativeKeyEvent (I87c57, b/173086397)

Phiên bản 1.0.0-alpha09

Ngày 16 tháng Mười hai, 2020

androidx.compose.runtime:runtime-*:1.0.0-alpha09 đã phát hành. Phiên bản 1.0.0-alpha09 bao gồm các thay đổi sau.

Thay đổi API

  • Đã xoá SlotTable, Slotreader và SlotWriter khỏi API công khai. Trước đây, các hàm này được đánh dấu là InternalComposeAPI. Bây giờ, chúng là nội bộ của mô-đun của Compose.

    CompositionData và CompositionGroup được thêm vào làm hàm thay thế cho API ui-tooling dùng để trích xuất thông tin về sự hợp thành. Các định dạng này là công khai nhưng không nhằm sử dụng bên ngoài API công cụ ui vì chúng cung cấp thông tin thô mà API công cụ diễn giải giao diện người dùng (I31a9c)

  • Loại Appier không còn được coi là (Id85b0)

  • Giao diện Applier đã thay đổi để đơn giản hoá việc xây dựng cây từ dưới lên thay vì từ trên xuống.

    Phương thức insert() được đổi tên thành insertTopDown().

    Thêm một phương thức mới là insertBottomUp().

    Một trình bổ trợ sẽ chèn các nút vào cây mà bạn đang chỉnh sửa bằng cách sử dụng insertTopDown() hoặc insertBottomUp(), tuỳ thuộc vào chế độ hoạt động hiệu quả hơn.

    Một số cây, chẳng hạn như LayoutNodeView, có hiệu quả hơn khi tạo từ dưới lên so với từ trên xuống. Trước đó, hệ thống phải có một tập hợp các quảng cáo chèn để triển khai từ dưới lên nên cần sao chép sang tất cả các bước bổ sung cần xây dựng từ dưới lên để đạt được hiệu suất. Với thay đổi này, Applier sẽ ghi đè insertBottomUp() để tạo từ dưới lên cây và insertTopDown() để tạo cây từ trên xuống. (Icbdc2)

  • Soạn thư hỗ trợ các phương thức getter của thuộc tính có thể thực hiện các lệnh gọi tổng hợp. Chúng tôi sẽ không hỗ trợ tính năng này nữa, nhưng cú pháp để khai báo getter thuộc tính là @Composable sẽ thay đổi.

    Cú pháp hiện đã ngừng sử dụng để thực hiện việc này bằng cách tự chú thích thuộc tính.

        @Composable val someProperty: Int get() = ...
    

    Cú pháp hiện đúng để thực hiện việc này là bằng cách chú thích getter của thuộc tính.

       val someProperty: Int @Composable get() = ...
    

    Cả hai cú pháp sẽ hoạt động trong một khoảng thời gian, nhưng cú pháp cũ không còn được dùng nữa sẽ trở thành lỗi biên dịch. (Id9197)

Sửa lỗi

  • AndroidOwner thực hiện nội bộ (Ibcad0, b/170296980)
  • subcomposeInto(LayoutNode) được đặt nội bộ (Id724a)

Phiên bản 1.0.0-alpha08

Ngày 2 tháng Mười hai, 2020

androidx.compose.runtime:runtime-*:1.0.0-alpha08 đã phát hành. Phiên bản 1.0.0-alpha08 bao gồm các thay đổi sau.

Thay đổi API

  • Thêm mục kiểm tra tìm lỗi mã nguồn (lint) cho việc đặt tên và vị trí tham số lambda của thành phần kết hợp, để kiểm tra tính nhất quán với nguyên tắc Compose. Ngoài ra, chúng tôi cũng đã di chuyển một số API sử dụng children làm tên cho lambda tạo vệt sang content, theo hướng dẫn và kiểm tra tìm lỗi mã nguồn. (Iec48e)
  • Trình kết hợp lại không còn chấp nhận Ngữ cảnh nhúng; các phần phụ thuộc lên lịch bắt buộc được lấy từ performanceCoroutineContext. FrameManager không còn được dùng nữa; việc tích hợp nền tảng này sẽ khởi chạy quá trình xử lý ảnh chụp nhanh toàn cầu của riêng chúng. (I02369)
  • Hàm RestorableStateHolder.withRestorableState đã được đổi tên thành RestorableStateProvider (66640)

Sửa lỗi

  • Ngừng sử dụng các Ambients được đặt tên với hậu tố là Ambient, và thay thế chúng bằng các thuộc tính mới có tiền tố là Ambient, tuân theo các nguyên tắc Ambients và Compose API khác. (I33440)
  • Xoá mô-đun cũ, giao diện người dùng kiểm tra giao diện người dùng và các nội dung mô-đun (I3a7cb)

Phiên bản 1.0.0-alpha07

Ngày 11 tháng Mười một, 2020

androidx.compose.runtime:runtime-*:1.0.0-alpha07 đã phát hành. Phiên bản 1.0.0-alpha07 bao gồm các thay đổi sau.

Tính năng mới

Thay đổi API

  • Tính năng chú thích @UnionType đã ngừng hoạt động (I57cde)
  • provideDefault đã được thêm thay thế để cung cấp các môi trường xung quanh và có thể được dùng để chỉ định các giá trị môi trường sẽ chỉ được đặt khi không có giá trị môi trường nào được cung cấp. (Id6635, b/171024925)
  • Công việc đã phát hành được đổi tên thành LaunchedEffect để có tính nhất quánI với các API SideEffect và DisposableEffect. LaunchedEffect không có các thông số chủ đề để khuyến khích các phương pháp hay nhất. (Ifd3d4)
  • Apptier hiện có các lệnh gọi lại onBeginChanges/onEndChanges được gọi khi Trình soạn bắt đầu/hoàn tất việc áp dụng các thay đổi cho cây. Bạn có thể sử dụng các công cụ này để quản lý tài nguyên theo lô nếu cần. (Icf476)
  • Trình soạn lại hiện yêu cầu CoroutineContext công trình đang xây dựng (Ic4610)
  • Các thay đổi đối với cách triển khai SlotTable nội bộ sẽ không ảnh hưởng đến API công khai. (If9828)
  • Các bộ chuyển đổi rxJava2 không còn hoạt động. Bộ chuyển đổi này không lấy giá trị ban đầu đã bị xoá (Idb72f)

Sửa lỗi

  • foundation.Text không được dùng nữa và thay thế bằng material.Text. Đối với một API văn bản cơ bản, không lựa chọn và không sử dụng giá trị nào từ một giao diện, hãy xem androidx.compose.foundation.BasicText. (If64cb)
  • BaseTextField không còn được dùng nữa. Sử dụng BasicTextField thay thế. (I896eb)
  • Một số biểu tượng liên quan đến bố cục đã được chuyển từ androidx.comose.ui sang androidx.comose.layout.ui. (I0fa98, b/170475424)

Đóng góp bên ngoài

  • Đã thêm mô-đun runtime-rxjava3 để soạn. Tương tự như runtime-rxjava2 (I02cbf)

Phiên bản 1.0.0-alpha06

Ngày 28 tháng Mười, 2020

androidx.compose.runtime:runtime-*:1.0.0-alpha06 đã phát hành. Phiên bản 1.0.0-alpha06 bao gồm các thay đổi sau.

Thay đổi API

  • Trình soạn lại hiện là CompositionReference và là mẹ sáng tác hợp lệ. Hiện tại, bạn bắt buộc phải sử dụng tính năng Trình soạn lại rõ ràng ở ít địa điểm hơn. (I4036f)
  • Đã thêm API đối tác DisposableEffect vào SideEffect, điền vai trò của onCommit-with-params nhưng với onDispose theo yêu cầu.
    • Thêm API RememberStateState để xuất bản dữ liệu từ quá trình kết hợp lại sang các quy trình đang diễn ra hoặc tồn tại lâu dài, chẳng hạn như DisposableEffects hoặc LaunchedTasks.
    • (Id50b9)
  • MutableVector hiện triển khai chế độ RandomAccess (I85d73, b/170461551)
  • Bổ sung hiệu ứng bên cạnh để áp dụng hiệu ứng phụ của thành phần vào các đối tượng do sáng tác quản lý. SideEffect được dành để thay thế bộ phận tích hợp onCommit. (Ia77c2)
  • Các tính năng mới thử nghiệm api RestorableStateHolder. Chế độ này cho phép lưu trạng thái được xác định bằng [saveInstanceState] và [rieSavedInstanceState] cho cây con trước khi huỷ bỏ để hệ thống có thể soạn lại vào lần tới trạng thái khôi phục. (I66884, b/166586419)

Sửa lỗi

  • Bật tính năng chuyển đổi trong ComposeTestRule; xoá tuỳ chọn để bật con trỏ nhấp nháy từ ComposeTestRule. (If0de3)

Phiên bản 1.0.0-alpha05

Ngày 14 tháng Mười, 2020

androidx.compose.runtime:runtime-*:1.0.0-alpha05 đã phát hành. Phiên bản 1.0.0-alpha05 bao gồm các thay đổi sau.

Thay đổi API

  • Modifier.pointerInput thử nghiệm tạm ngưng công cụ sửa đổi đầu vào (Ia77d2)
  • Hiệu suất cuộn của LazyColumn/Row được cải thiện bằng cách thực hiện ít công việc hơn trong phân mục trên mỗi lần cuộn. Phương thức hasInvalidations() mới đã được thêm vào cho loại Thành phần. có phương thức hasPendingChanges() từ Trình soạn lại đã được đổi tên thành hasInvalidations() (Ib2f32, b/168293643, b/167972292, b/165028371)
  • Thêm API productsState cho việc chạy coroutine từ thành phần cập nhật một giá trị State<T> theo thời gian (Id4a57)
  • launchInComposition được đổi tên thành LaunchTask để phù hợp với các nguyên tắc Soạn API (I99a8e)
  • Thứ tự của các lệnh gọi place() trong Layout tuỳ chỉnh hiện sẽ xác định thứ tự bản vẽ cho thành phần con (Ibc9f6)

Phiên bản 1.0.0-alpha04

Ngày 1 tháng Mười, 2020

androidx.compose.runtime:runtime-*:1.0.0-alpha04 đã phát hành. Phiên bản 1.0.0-alpha04 bao gồm các thay đổi sau.

Thay đổi API

  • Thêm OwnerScope để cho phép thu thập bố cục và vẽ phạm vi quan sát khi các phạm vi này không còn hợp lệ. (Ic4cf8)
  • Đã thêm API derivedStateOf để tạo các đối tượng Trạng thái dựa trên phép tính có thể đọc (và được lấy từ) các đối tượng Trạng thái khác (If758b)
  • Đã thêm API TestOnly cho SnapshotStateObserver (I6e2a9)

Sửa lỗi

  • foundation.Box không còn được dùng nữa. Thay vào đó hãy dùng foundation.layout.Box. (Ie5950, b/167680279)

Phiên bản 1.0.0-alpha03

Ngày 16 tháng Chín, 2020

androidx.compose.runtime:runtime-*:1.0.0-alpha03 đã phát hành. Phiên bản 1.0.0-alpha03 bao gồm các thay đổi sau.

Thay đổi API

  • CompositionCoroutineScope không còn triển khai MonotonicFrameClock. Người gọi của withFrameNanos nên nhập hàm cấp cao nhất một cách rõ ràng. (Icb642, b/166778123)

Sửa lỗi

  • Các hàm thử nghiệm toàn cầu như onNode hoặc waitForIdle hiện không còn được dùng nữa. Vui lòng chuyển sang các tệp thử nghiệm mới đã được xác định trong SoạnTestQuy định (I7f45a)
  • launchInComposition không còn phát hành coroutine chưa được gửi (Ief6af, b/166486000)

Phiên bản 1.0.0-alpha02

Ngày 2 tháng Chín, 2020

androidx.compose.runtime:runtime-*:1.0.0-alpha02 đã phát hành. Phiên bản 1.0.0-alpha02 bao gồm các thay đổi sau.

Thay đổi API

  • Thêm các API snapshotFlowwithMutableSnapshot để sử dụng và tạo các thay đổi đối với dữ liệu Tổng quan. (I3e722)
  • Quy ước gọi cho các hàm có khả năng kết hợp đã thay đổi. Đây là một thay đổi có thể gây lỗi nhị phân. Tất cả các thư viện phải được biên dịch lại để hoạt động với phiên bản trình biên dịch biên dịch này.

    Thay đổi này không tạo ra sự thay đổi có thể gây lỗi ở cấp nguồn do các API duy nhất đã thay đổi là API trình biên dịch có lựa chọn rõ ràng. (I7afd2, b/158123185)

  • Đã xoá phương thức lên lịch khỏi EmbeddingContext (I7b9be)

  • onPreCommit không còn được hỗ trợ nữa; onCommit hiện có hành vi của onPreCommit.

    onCommit và onActive hiện đang chạy trong cùng một khung dàn dựng mà những sự thay đổi thành phần được xác nhận (commit) ở trong thay vì ở đầu khung dàn dựng tiếp theo. (I70403)

Phiên bản 1.0.0-alpha01

Ngày 26 tháng Tám, 2020

androidx.compose.runtime:runtime-*:1.0.0-alpha01 đã phát hành. Phiên bản 1.0.0-alpha01 chứa nhữngcam kết này.

Phiên bản 0.1.0-dev

Phiên bản 0.1.0-dev17

Ngày 19 tháng Tám, 2020

androidx.compose.runtime:runtime-*:0.1.0-dev17 đã phát hành. Phiên bản 0.1.0-dev17 bao gồm các thay đổi sau.

Thay đổi API

  • Bây giờ, hệ thống có thể khai báo một hoặc nhiều bộ thiết lập của bộ thiết bị gốc do một bộ phát sóng có thể bỏ qua và kết hợp lại một cách độc lập. (Ibbd13)
  • Đã xoá các lệnh gọi FrameManager đã ngừng hoạt động.

    API soạn thư nội bộ đã được thay đổi để giảm số lượng giá trị đầu vào để theo dõi các đối tượng trạng thái như mutableStateof() (I80ba6)

  • Thành phần kết hợp state { ... } hiện đã ngừng sử dụng, và thay vào đó là các lệnh gọi tới remember { mutableStateOf(...) } để đảm bảo sự rõ ràng. Điều này làm giảm giao diện API tổng thể và số khái niệm để quản lý trạng thái, đồng thời khớp với mẫu by mutableStateOf() của uỷ quyền thuộc tính loại. (Ia5727)

  • Flow.collectAsState hiện sẽ xác định trình điều phối mặc định từ chính thành phần thay vì đặt mặc định là Dispatchers.Main. (I9c1d9)

  • Sự cố khi lưu nội dung nào đó vào trạng thái sử dụng bên trong vòng lặp đã được khắc phục. Hiện tại, bạn đã cho phép khoá tương tự trong savedInstanceState(), nên api của UiSavedStateRegistry hiện được điều chỉnh theo yêu cầu mới này (I4ab76 ,b/160042650, b/156853976, b/159026663, b/154920561)

Sửa lỗi

  • emitView không được dùng nữa. Hãy sử dụng AndroidView nếu có thể để phát Chế độ xem bên trong ứng dụng Compose. Lưu ý rằng việc soạn thảo Chế độ xem và Nhóm xem trực tiếp sẽ không được hỗ trợ trong tương lai trừ khi đây là những lá trong cây bố cục, trong trường hợp có thể đạt được điều này bằng cách sử dụng AndroidView. (I29b1e, b/163871221)

Phiên bản 0.1.0-dev16

Ngày 5 tháng Tám, 2020

androidx.compose.runtime:runtime-*:0.1.0-dev16 đã phát hành. Phiên bản 0.1.0-dev16 bao gồm các thay đổi sau.

Thay đổi API

  • Chính sách thay đổi mặc định của mutableStateOf(), ambientOf()savedInstanceStateOf() đã thay đổi thành structuralEqualityPolicy() thay vì referentialEqualityPolicy().

    Giá trị mặc định để quyết định liệu một giá trị mới được gán cho một bản sao mutableStateOf() có được coi là một thay đổi hay không sẽ mặc định sử dụng == thay vì sử dụng ===.

    Hãy truy cập https://kotlinlang.org/docs/reference/equality.html

    ambientOf()savedInstanceStateOf() sử dụng mutableStateOf() trong quá trình triển khai nên đã được thay đổi để nhất quán với mutableStateOf().

    Việc sử dụng bình đẳng cấu trúc phù hợp hơn với kỳ vọng của nhà phát triển.

    Ví dụ,

    val state = mutableStateOf(1f)
    

    theo sau bởi,

    state.value = 1f
    

    sẽ không được coi là thay đổi đối với state và việc sử dụng state trong quá trình sáng tác sẽ không cần được tổng hợp lại.

    Đây là một thay đổi có thể gây lỗi, nhưng trong hầu hết các trường hợp (chẳng hạn như khi sử dụng các loại không ghi đè equals()), điều này sẽ không ảnh hưởng đáng kể đến ứng dụng.

    Các loại ghi đè equals(), chẳng hạn như các loại data, có thể thấy sự suy giảm hiệu suất vì phương thức equals() của lớp đó, theo mặc định hiện được gọi khi được chỉ định cho mutableStateOf().

    Bạn có thể khôi phục hành vi trước đó bằng cách thêm thông số chính sách policy = referentialEqualityPolicy() vào các lệnh gọi đến mutableStateOf(), ambientOf()savedInstanceStateOf(). (Ic21a7)

  • RowColumn hiện đang thực hiện chức năng cùng dòng đã giảm đáng kể tài nguyên sử dụng. (I75c10)

Sửa lỗi

  • setViewContent đã ngừng sử dụng. setContent nên được dùng để thay thế. (I7e497, b/160335130)
  • Đã thêm MonotonicFrameAnimationClock cho phép bạn sử dụng MonotonicFrameClock như là một AnimationClockObservable để làm cầu nối giữa các đồng hồ và API dựa trên coroutine mới mà vẫn sử dụng các đồng hồ dựa trên lệnh gọi lại cũ.

    MonotonicFrameClock tương đương với ManualAnimationClock giờ đây là ManualFrameClock. (I111c7, b/161247083)

  • Modifier.stateDraggable đã được làm lại hoàn toàn và đổi tên thành Modifier.swipeable. Một loại SwipableState mới đã được giới thiệu và DrawerState và BottomDrawerState đã được cấu trúc lại để kế thừa từ nó. [Modal / Bottom] DrawerLayout không còn nhận tham số onStateChange. (I72332, b/148023068)

  • Modifier.plus không còn được dùng nữa, thay vào đó, hãy dùng Modifier.then. "Then" có tín hiệu rõ ràng hơn về thứ tự, đồng thời nghiêm cấm nhập Modifier.padding().background() + anotherModifier, khiến cho chuỗi bị phá vỡ và khó đọc hơn (Iedd58, b/161529964)

  • Đã thêm SubcomposeLayout. Đây là danh sách gốc cấp độ thấp cho phép soạn phần tử con trong quá trình đo lường nếu chúng ta chỉ muốn sử dụng một số giá trị có sẵn trong quá trình đo lường cho thành phần cây con Ví dụ: WithConstraints không được triển khai bằng SubcomposeLayout. (I25cc8)

  • Material FilledTextField được đổi tên thành TextField và TextField cơ bản đã được đổi tên thành BaseTextField để giúp người dùng dễ dàng khám phá và sử dụng API mong muốn đơn giản nhất (Ia6242, b/155482676)

  • Modifier.drawBackground đã được đổi tên thành Modifier.background (I13677)

Phiên bản 0.1.0-dev15

Ngày 22 tháng Bảy, 2020

androidx.compose.runtime:runtime-*:0.1.0-dev15 đã phát hành. Phiên bản 0.1.0-dev15 bao gồm các thay đổi sau.

Cập nhật phần phụ thuộc

  • Để sử dụng phiên bản 0.1.0-dev15 của Compose, bạn cần cập nhật các phần phụ thuộc theo đoạn mã mới hiển thị ở trên trong phần Khai báo phần phụ thuộc.

Thay đổi API

  • Chú thích @Model hiện không được dùng nữa. Hãy sử dụng trạng thái và mutableStateOf để thay thế. Quyết định ngừng sử dụng này đã được đưa ra sau nhiều cuộc thảo luận cẩn thận.

    Căn chỉnh

    Lý giải bao gồm nhưng không giới hạn trong:

    • Giảm diện tích bề mặt API và các khái niệm mà chúng tôi cần hướng dẫn
    • Căn chỉnh chặt chẽ hơn với các bộ công cụ so sánh khác (Giao diện người dùng Swift, React, Flutter)
    • Quyết định đảo ngược. Chúng tôi luôn có thể mang @Model trở lại sau này.
    • Xoá trường hợp sử dụng corner-case và khó trả lời các câu hỏi về việc định cấu hình @Model dưới dạng những việc chúng tôi cần xử lý
    • @Model loại dữ liệu, hàm cân bằng, mã băm, v.v.
    • Làm thế nào tôi có một số thuộc tính "quan sát được" và các thuộc tính khác thì không?
    • Làm cách nào để tôi chỉ định sự bằng nhau về cấu trúc so với tham chiếu được dùng trong nội dung quan sát?
    • Giảm "ma thuật" trong hệ thống. Sẽ làm giảm khả năng ai đó giả định rằng hệ thống thông minh hơn hệ thống trên thực tế (nghĩa là nó biết cách mở rộng một danh sách)
    • Giúp độ chi tiết của quá trình quan sát trở nên trực quan hơn.
    • Cải thiện khả năng tái tạo từ biến -> thuộc tính trên lớp
    • Có khả năng mở ra khả năng tối ưu hoá theo từng Trạng thái được tạo thủ công
    • Căn chỉnh phù hợp hơn với phần còn lại của hệ sinh thái và giảm sự mơ hồ đối với thành phần bất biến hoặc chúng ta đang “chấp nhận trạng thái có thể thay đổi”

    Ghi chú di chuyển

    Hầu như tất cả cách sử dụng hiện tại của @Model đều không thay đổi theo một trong hai cách. Ví dụ dưới đây có một lớp @Model chứa hai thuộc tính chỉ để dùng làm ví dụ và lớp này đang được sử dụng trong một thành phần kết hợp.

    @Model class Position(
     var x: Int,
     var y: Int
    )
    
    @Composable fun Example() {
     var p = remember { Position(0, 0) }
     PositionChanger(
       position=p,
       onXChange={ p.x = it }
       onYChange={ p.y = it }
     )
    }
    

    Phương án 1: Sử dụng State<OriginalClass> và tạo bản sao.

    Cách tiếp cận này được thực hiện dễ dàng hơn với các lớp dữ liệu của Kotlin. Về cơ bản, hãy tạo tất cả các thuộc tính var trước đó thành các thuộc tính val của một lớp dữ liệu, sau đó sử dụng state thay vì remember và gán giá trị trạng thái cho các bản sao gốc của lớp dữ liệu gốc bằng cách sử dụng phương thức tiện lợi copy(...) của lớp dữ liệu.

    Điều quan trọng cần lưu ý là cách tiếp cận này chỉ hoạt động khi các đột biến duy nhất đối với lớp đó được thực hiện trong cùng phạm vi mà phiên bản State được tạo. Nếu lớp tự biến đổi bên ngoài phạm vi sử dụng và bạn đang dựa vào nội dung quan sát biến đổi, thì cách tiếp cận tiếp theo là cách mà bạn sẽ muốn sử dụng.

    data class Position(
     val x: Int,
     val y: Int
    )
    
    @Composable fun Example() {
     var p by state { Position(0, 0) }
     PositionChanger(
       position=p,
       onXChange={ p = p.copy(x=it) }
       onYChange={ p = p.copy(y=it) }
     )
    }
    

    Phương án 2: Sử dụng mutableStateOf và các đại diện thuộc tính

    Cách tiếp cận này trở nên dễ dàng hơn với các đại diện thuộc tính của Kotlin và API mutableStateOf cho phép bạn tạo các phiên bản MutableState ngoài thành phần kết hợp. Về cơ bản, hãy thay thế tất cả các thuộc tính var của lớp ban đầu bằng các thuộc tính varmutableStateOf làm đại diện thuộc tính của chúng. Điều này có lợi thế là cách sử dụng lớp này hoàn toàn không thay đổi, mà chỉ có cách triển khai nội bộ của lớp đó. Tuy nhiên, hành vi này không hoàn toàn giống với ví dụ ban đầu vì mỗi thuộc tính hiện được quan sát/đăng ký riêng lẻ, vì vậy các thành phần mà bạn thấy sau khi kết hợp lại này có thể hẹp hơn (một điều tốt).

    class Position(x: Int, y: Int) {
     var x by mutableStateOf(x)
     var y by mutableStateOf(y)
    }
    
    // source of Example is identical to original
    @Composable fun Example() {
     var p = remember { Position(0, 0) }
     PositionChanger(
       position=p,
       onXChange={ p.x = it }
       onYChange={ p.y = it }
     )
    }
    

    (I409e8, b/152050010, b/146362815, b/146342522, b/143413369, b/135715219, b/143263925, b/139653744)

  • Thay đổi chiến lược tạo mã của trình biên dịch của Compose. Trước khi có thay đổi, trình biên dịch soạn thư sẽ chuyển đổi lệnh gọi thành các hàm có khả năng kết hợp. Với thay đổi này, giờ đây, chúng tôi đã chuyển đổi phần nội dung của hàm có khả năng kết hợp và giữ lại trang web không có hiệu lực (chủ yếu).

    Điều này có nghĩa là hầu hết logic giao tiếp với môi trường thời gian chạy sẽ xảy ra ở phần đầu của nội dung hàm, thay vì ở phần gọi trang.

    Đây phải là một thay đổi tương thích với nguồn để sử dụng khi soạn. Hầu hết người dùng soạn không phải cập nhật bất kỳ mã nào do sự thay đổi này.

    Để hỗ trợ công việc này, chữ ký JVM của tất cả các hàm có khả năng kết hợp đã thay đổi. Hàm Composable chấp nhận một tham số được chuyển đổi thành hàm chấp nhận 3 tham số, các tham số bổ sung là Composer, một số nguyên 'key'. số nguyên bitmask dùng để truyền siêu dữ liệu qua các lệnh gọi.

    Compose hiện cũng sẽ biến đổi các đối số mặc định thành hàm có khả năng kết hợp. Ad Manager có thể thực hiện việc này mà không cung cấp thêm quá trình tổng hợp mặc định của hàm, vì vậy thay đổi này sẽ làm giảm ít chức năng được xác định.

    Những thay đổi cố ý về hành vi cố ý xuất phát từ điều này:

    1. Một số cuộc gọi sẽ bỏ qua nơi mà trước đây không như vậy
    2. Các biểu thức tổng hợp trong biểu thức đối số mặc định hiện đã được đăng ký và xử lý chính xác

    Công việc này bao gồm một số điểm tối ưu hoá: 1. Kết quả so sánh các thông số được truyền qua biểu đồ lệnh gọi đến các hàm có khả năng kết hợp khác. Do đó, khi so sánh vào thời gian chạy, bạn sẽ nhận được ít dữ liệu hơn, giảm kích thước bảng vị trí cũng như bỏ qua nhiều hàm có khả năng kết hợp hơn mà trước đây không bị bỏ qua 2. Thông số được xác định là “tĩnh” tại thời điểm biên dịch không còn được so sánh hoặc lưu trữ trong thời gian chạy nữa. Điều này làm giảm số lượng phép so sánh và giảm kích thước bảng vùng. 3. Cấu trúc luồng kiểm soát của phần nội dung được dùng để giảm thiểu số nhóm được tạo. Việc này giúp giảm kích thước bảng vị trí và dẫn đến thời gian chạy ít hơn 4. Thông số gửi và nhận không được sử dụng cho các hàm không được bao gồm trong việc xác định khả năng có thể bỏ qua của hàm nếu chúng không được sử dụng trong phần nội dung của hàm.

    Hầu hết các thay đổi có thể gây lỗi đều là đối với các API mà trình biên dịch nhắm mục tiêu trực tiếp, và việc sử dụng tính năng soạn thư thường sẽ không bị ảnh hưởng: 1. Composer::startExpr đã bị xoá 2. Composer::endExpr đã bị xoá 3. Composer::call đã ngừng hoạt động 4. Các quá tải không phải varargs của key đã bị xoá. Sử dụng phiên bản vararg trở đi. 5. Chú thích Pivotal không còn được dùng nữa. Hãy sử dụng key để thay thế. 6. ScopeUpdateScope::updateScope đã được thay đổi thành Function3 thay vì Function1 7. restartableFunction và restartableFunctionN đã được cập nhật để bao gồm các thông số thời gian biên dịch bổ sung (I60756, b/143464846)

  • Đã thêm SortWith và removeRange vào MutableVector (Icccf7)

  • Thêm phương thức triển khai mặc định cho CompositionLifecycleObserver (I24289)

  • Appier hiện yêu cầu phương thức clear() để xử lý các sáng tác (Ibe697)

  • Đã thêm asMutableList() vào MutableVector để cho phép nó được chuyển đến API công khai mà không cần phải sao chép toàn bộ danh sách. (I298df)

  • Đã thêm RememberCoroutineScope() để lấy CoroutineScope đã quản lý trong thành phần để khởi chạy các công việc và phản hồi sự kiện. (I0e264)

  • Mutableve là một bộ sưu tập mới không triển khai bất kỳ giao diện Bộ sưu tập chuẩn nào. Bộ sưu tập này cung cấp tốc độ cao hơn các yêu cầu khác và chỉ được dùng trong các hoạt động triển khai nội bộ (I8ebd6)

  • Đã tạm thời xoá StableMutableListStableMutableMap để tránh xảy ra sự cố trong phiên bản dùng ứng dụng Kotlin. Các giao diện này sẽ được giới thiệu lại khi tính năng soạn thư được cập nhật lên phiên bản Kotlin không gặp vấn đề.

    SnapshotStateListSnapshotStateMap hiện đang ở chế độ công khai nhưng sẽ không được dùng nữa sau khi StableMutableListStableMutableMap được khôi phục. (Ia7769)

  • thêm hàm cấp cao nhất withFrameNanos cho thời gian hoạt ảnh (Ie34c5)

  • Chú thích @Untracked không còn được dùng nữa. Thay thế bằng @ComposableContract(tracked=false) (Id211e)

  • RestartableFunction và các API liên kết đã được đổi tên thành ComposableLambda, v.v. Các API này chỉ được nhắm mục tiêu bởi trình biên dịch nên điều này sẽ không ảnh hưởng đến khả năng tương thích cấp nguồn thông thường. Quá trình đổi tên được thực hiện chủ yếu để cho thấy rằng lớp này hiệu quả hơn khi hiển thị trong dấu vết ngăn xếp (I7eb25)

  • Chú thích @Composable không còn hợp lệ trên các loại (Ia5f02)

  • Ambient<T> hiện là @Stable thay vì @Immutable (I0b4bb)

  • Trước khi có sự thay đổi này, trình biên dịch trình biên dịch sẽ không chặn các lệnh gọi tới hàm tạo trong hàm @Composable nếu có (I5205a, b/158123804)

  • Thành phần kết hợp Trình soạn lại này không còn là một bản tóm tắt hữu ích nữa. Hầu hết quá trình kết hợp lại nên xảy ra như là kết quả của các phép gán MutableState. Đối với những dữ liệu khác, bạn nên dùng hàm invalidate để kích hoạt quá trình kết hợp lại phạm vi hiện tại. (Ifc992)

  • Quan sát không còn là một đoạn trừu tượng hữu ích nữa. Nếu cần tái tạo, sự triển khai của tính năng đó có thể được sao chép bằng cách chỉ tạo một hàm có khả năng kết hợp thực thi tham số lambda có thể kết hợp. Ví dụ: @Composable fun Observe(body: @Composable () -> Unit) = body() (I40d37)

  • @Direct đã ngừng hoạt động, thay vào đó là @ComposableContract(restartable=false) (If4708)

  • Bổ sung bộ chuyển đổi cho StateFlow được giới thiệu gần đây. Bộ chuyển đổi này cho phép điền trước giá trị ban đầu để có thể sử dụng Trạng thái trả về (I61dd8, b/156233789)

  • Đã thêm bộ chuyển đổi cho Flow. Ví dụ về cách sử dụng: giá trị val theo flow.collectAsState() (Nếu 2198, b/153375923)

  • Các toán tử uỷ quyền thuộc tính [Mutable]State đã được chuyển sang phần mở rộng để hỗ trợ tính năng tối ưu hoá uỷ quyền thuộc tính Kotlin 1.4. Các lệnh gọi phải thêm các mục nhập để tiếp tục sử dụng by state { ... } hoặc by mutableStateOf(...). (I5312c)

  • androidx.compose.ViewComposer đã được chuyển sang androidx.ui.node.UiComposer androidx.compose.Emittable đã bị xoá. Nội dung này dư thừa so với ComponentNode. androidx.compose.ViewAdapters đã bị xoá. Chúng không còn là trường hợp sử dụng được hỗ trợ. Compose.composeInto không còn được dùng nữa. Thay vào đó, hãy sử dụng setContent hoặc setViewContent. Compose.disposeComposition không còn được dùng nữa. Thay vào đó, hãy sử dụng phương thức dispose trên Composition do setContent trả về. androidx.compose.Compose.subcomposeInto đã được chuyển sang androidx.ui.core.subcomposeInto ComponentNode#emitInsertAt đã được đổi tên thành ComponentNode#insertAt ComponentNode#emitRemoveAt đã được đổi tên thành ComponentNode#removeAt ComponentNode#emitMode đã được đổi tên thành ComponentNode#move (Idef00)

  • Đã cập nhật cờ ComposeFlags.COMPOSER_PARAM thành true. cờ này sẽ thay đổi chiến lược tạo mã cho trình bổ trợ soạn. Ở cấp độ cao, việc này sẽ tạo ra các hàm @Composable với một thông số tổng hợp bổ sung. Hệ thống sẽ chuyển các thông số này đến các lệnh gọi @Composable tiếp theo để thời gian chạy có thể quản lý việc thực thi một cách chính xác. Tuy nhiên, đây là một thay đổi quan trọng liên quan đến việc phá vỡ tệp nhị phân. Tuy nhiên, quy trình này cần phải duy trì khả năng tương thích ở cấp nguồn trong tất cả các trường hợp sử dụng của Compose đã bị xử lý. (I7971c)

  • Thay đổi có thể gây lỗi đối với API môi trường xung quanh. Hãy xem nhật ký và tài liệu Ambient<T> để biết thông tin chi tiết (I4c7ee, b/143769776)

  • Đã thêm giao diện người dùng trực tiếp – cấu phần của phần mềm mới có bộ chuyển đổi cho LiveData. Ví dụ về cách sử dụng: giá trị val theo liveData.observeAsState() (Ie9e8c, b/150465596)

  • Các bộ chuyển đổi Rx không có giá trị ban đầu rõ ràng sẽ không được dùng nữa. Sử dụng giá trị rỗng không phải lúc nào cũng là giá trị mặc định tốt nhất, ví dụ khi bạn có Danh sách, bạn nên bắt đầu bằng emptyList() hoặc bất kỳ giá trị mặc định hợp lý nào khác (I00025, b/161348384)

  • Đã thêm ui-rxJava2 - cấu phần của phần mềm mới với bộ chuyển đổi cho RxJava2. Ví dụ về cách sử dụng: giá trị val theo observable.subscriptionAsState() (Ifab4b, b/153369097)

  • savedInstanceState() hiện có thể được sử dụng với các loại không có giá trị (I6847f, b/153532190)

  • listSaver() và mapSaver() mới giúp bạn dễ dàng ghi các đối tượng Trình tiết kiệm tuỳ chỉnh (I8cf68, b/152331508)

  • Hàm mới: savedInstanceState() và rememberSavedInstanceState(). Chúng tương tự như state() và remember() nhưng có bản dựng hỗ trợ trạng thái bản sao đã lưu trong (If1987, b/152025209)

Sửa lỗi

  • runOnIdleCompose đã được đổi tên thành runOnIdle (I83607)
  • Đã tạo API thử nghiệm LayoutNode (I4f2e9)
  • androidx.ui.foundation.TextFieldValue và androidx.ui.input.EditorValue không còn được dùng nữa. Các thành phần kết hợp TextField, FilledTextField và CoreTextField sử dụng loại đó cũng không còn được dùng nữa. Vui lòng sử dụng androidx.ui.input.TextFieldValue thay thế (I4066d, b/155211005)
  • Đã xoá API DrawBackground không còn được dùng nữa, thay vào đó là các API mở rộng drawBackground trên Công cụ sửa đổi. Tái cấu trúc việc triển khai màu sắc, bút vẽ và màu vẽ drawBackground để giảm đường dẫn mã lệnh cũng như xoá yêu cầu tạo Công cụ sửa đổi dưới dạng một phần của phương thức hợp thành. (I0343a)
  • Cập nhật các API của Compose cấp độ cao hơn để hiển thị CanvasScope thay cho Canvas. Việc này giúp người tiêu dùng không cần phải duy trì các đối tượng Paint của riêng mình. Đối với khách hàng vẫn yêu cầu quyền truy cập vào một Canvas, họ có thể sử dụng phương thức mở rộng drawCanvas. Phương thức này cung cấp một lệnh gọi lại để tạo ra một lệnh vẽ cho Canvas. (I80afd)
  • API hàm lambda tạo vệt WithConstraints đã được thay đổi. Giờ đây, thay vì hai thông số, giao diện này có phạm vi trình tiếp nhận. Cùng với các giới hạn và layoutDirection, giao diện cung cấp các thuộc tính minWidth, maxWidth, minHeight và maxHeight trong Dp (I91b9a, b/149979702)
  • Đã thêm công cụ sửa đổi khoảng đệm đối xứng. (I39840)
  • Đã cập nhật wrapContentWidth và wrapContentHeight để kỳ vọng Căn chỉnh dọc hoặc ngang thay vì bất kỳ Căn chỉnh nào. Công cụ sửa đổi trọng lực được cập nhật để chấp nhận Căn chỉnh dọc hoặc ngang. Hàng, Cột và Ngăn xếp được cập nhật để hỗ trợ Căn chỉnh liên tục tuỳ chỉnh. (Ib0728)
  • mô-đun ui-text được đổi tên thành ui-text-core (I57dec)
  • Cải thiện API DrawModifier:
    • Đã tạo phạm vi người nhận cho draw() ContentDrawScope
    • Xoá tất cả thông số trên draw()
    • DrawScope có giao diện giống như CanvasScope cũ
    • ContentContentScope có phương thức DrawContent() (Ibaced, b/152919067)
  • ColoredRect không còn được dùng nữa. Thay vào đó, hãy sử dụng Box(Modifier.preferredSize(width, height).drawBackground(color)). (I499fa, b/152753731)
  • Đã thay thế Công cụ sửa đổi cùng với toán tử có các hàm mở rộng về trạng thái ban đầu (I225e4)
  • Giờ đây, bạn có thể truy cập các thành phần RowScope và ColumnScope bên ngoài Hàng và Cột. (I3a641)
  • Đã đổi tên LayoutFlexible thành LayoutWeight. Đổi tên thông số chặt chẽ để điền. (If4738)
  • WithConstraints đã nhận tham số LayoutDirection (I6d6f7)
  • Đã đổi tên nền thành DrawBackground và đặt ghi nhớ mặc định tên này (Ia0bd3)
  • Đã thay thế ButtonStyle bằng các chức năng riêng biệt và loại bỏ quá tải (chuỗi) văn bản. Xem mẫu đã cập nhật để biết thông tin về cách sử dụng. (If63ab, b/146478620, b/146482131)
  • runOnIdleComposerunOnUiThread hiện là các hàm chung thay vì các phương thức trên ComposeTestRule. (Icbe8f)

Đóng góp bên ngoài

  • Xoá API không cần thiết như Looper và Handler khỏi lớp chuyển Thời gian chạy Compose (I6847d)
  • Loại bỏ Flow<T>.collectAsState() không có giá trị ban đầu. Hãy sử dụng StateFlow<T> hoặc chuyển giá trị ban đầu rõ ràng. (I63f98, b/157674865)