2017-07-31 30 views
6

Tôi có mã sau đây sản xuất lỗi lint sau đây. lint issueKotlin áp dụng() tin nhắn mở rộng lint trong Android Studio 3.0-alpha8

fun newInstance(message: String?): DialogFragment { 
    return DialogFragment().apply { 
     arguments = Bundle().apply { 
      putString("arg", message) 
     } 
    } 
} 

Thông điệp chỉ ra rằng this tham khảo bên apply() điểm chức năng để BaseBundle lớp đó là có sẵn từ API 21 mà sẽ sụp đổ vào API thấp hơn. Bundle#putString(key, value) chắc chắn có sẵn trên các phiên bản thấp hơn, nhưng có lỗi trong Android Studio 3.0-alpha8.

Vấn đề này khá kỳ lạ như tôi có thể thấy dịch ngược mã như này: decompiled

nào làm tham khảo Bundle không loại một BaseBundle.

Tại sao chúng ta có lỗi Lint ở vị trí đầu tiên?

+0

làm thế nào bạn dịch ngược mã? – lelloman

+0

@lelloman Tôi đã dựa vào Android Studio "Hiển thị Kotlin Bytecode". Có một nút "Biên dịch ngược" trong tab xuất hiện ở bên phải của ngăn Android Studio. Một cách khác là sử dụng "classyshark-bytecode-viewer", nhưng tôi chưa thử nó. –

+0

cool thx! Tôi đã thử mã của bạn và tôi nhận thấy một điều, nếu tôi làm cho lớp TestKt mở rộng Xem, cảnh báo biến mất ..: \ – lelloman

Trả lời

1

Một workaround là sử dụng let thay vì apply, như:

fun newInstance(message: String?): DialogFragment { 
    return DialogFragment().apply { 
     arguments = Bundle().let { 
      it.putString("arg", message) 
      it 
     } 
    } 
} 
3

Nó thực sự trông giống như một lỗi Đây là một known bug nhưng thực sự có thể thấy lý do bạn nhận được cảnh báo nếu xem mã nguồn Bundle.java.

Trước api 21 Bundle đã có một phương pháp (check here)

public void putString(@Nullable String key, @Nullable String value) 

và lớp mình không có lớp siêu. Từ api 21 Bundle kéo dài một lớp mới được thêm BaseBundle và phương pháp này putString đã là moved đến BaseBundle. Vì vậy, khi bạn gọi phương thức trên api 21 trở lên, phương thức thuộc về BaseBundle, đối với phiên bản thấp hơn, nó thuộc về Bundle.

Điều này liên quan đến khối apply vì cảnh báo không xuất hiện nếu bạn gọi phương thức trực tiếp trên biến số Bundle.

+0

Có một vấn đề khác cho nó: https://youtrack.jetbrains.com/issue/KT-17973 –

Các vấn đề liên quan