Như những người khác đã đề cập, AndroidViewModel
bạn có thể lấy Context
cái gì để có được ứng dụng nhưng từ những gì tôi thu thập được trong các nhận xét, bạn đang cố gắng thao túng @drawable
các s từ bên trong của mình ViewModel
để đánh bại mục đích MVVM.
Nói chung, nhu cầu có một Context
trong ViewModel
hầu hết các gợi ý rằng bạn nên xem xét suy nghĩ lại cách bạn phân chia logic giữa View
s và của bạn ViewModels
.
Thay vì ViewModel
giải quyết các phần có thể kéo và đưa chúng vào Hoạt động / Phân mảnh, hãy cân nhắc để Phân đoạn / Hoạt động sắp xếp các phần có thể kéo dựa trên dữ liệu được sở hữu bởi ViewModel
. Giả sử, bạn cần các bảng có thể kéo khác nhau được hiển thị trong chế độ xem cho trạng thái bật / tắt - đó là trạng thái ViewModel
sẽ giữ trạng thái (có thể là boolean) nhưng việc View
của bạn là chọn có thể kéo cho phù hợp.
Nó có thể được thực hiện khá dễ dàng với DataBinding :
<ImageView
...
app:src="@{viewModel.isOn ? @drawable/switch_on : @drawable/switch_off}"
/>
Nếu bạn có nhiều trạng thái và có thể kéo hơn, để tránh logic khó sử dụng trong tệp bố cục, bạn có thể viết BindingAdapter tùy chỉnh để dịch, chẳng hạn như, một Enum
giá trị thành R.drawable.*
(ví dụ: phù hợp với thẻ)
Hoặc có thể bạn cần Context
một thành phần nào đó mà bạn sử dụng bên trong ViewModel
- sau đó, tạo thành phần bên ngoài ViewModel
và chuyển nó vào. Bạn có thể sử dụng DI, hoặc singletons, hoặc tạo Context
thành phần-phụ thuộc ngay trước khi khởi tạo ViewModel
trong Fragment
/ Activity
.
Tại sao phải bận tâm: Context
là một thứ dành riêng cho Android và phụ thuộc vào những thứ đó ViewModel
là một thực tế không tốt: chúng cản trở việc kiểm thử đơn vị. Mặt khác, các giao diện thành phần / dịch vụ của riêng bạn hoàn toàn nằm trong tầm kiểm soát của bạn nên bạn có thể dễ dàng mô phỏng chúng để thử nghiệm.
AndroidViewModel
nhưng nhận đượcCannot create instance exception
thì bạn có thể tham khảo câu trả lời này của tôi stackoverflow.com/a/62626408/1055241