ดังที่คนอื่น ๆ กล่าวถึงมีAndroidViewModelสิ่งที่คุณสามารถได้รับจากการรับแอปContextแต่จากสิ่งที่ฉันรวบรวมในความคิดเห็นคุณกำลังพยายามจัดการ@drawables จากภายในของคุณViewModelซึ่งเอาชนะจุดประสงค์ MVVM
โดยทั่วไปจำเป็นที่จะต้องมีContextในของคุณViewModelเกือบทุกแห่งแนะนำให้คุณควรพิจารณาทบทวนวิธีการที่คุณแบ่งตรรกะระหว่างคุณและViewViewModels
แทนที่จะมีการViewModelแก้ปัญหา drawables และป้อนไปยัง Activity / Fragment ให้พิจารณาให้ Fragment / Activity เล่นกล drawables ตามข้อมูลที่อยู่ในไฟล์ViewModel. สมมติว่าคุณต้องใช้ drawables ที่แตกต่างกันเพื่อแสดงในมุมมองสำหรับสถานะเปิด / ปิดซึ่งเป็นสิ่งViewModelที่ควรมีสถานะ (อาจเป็นบูลีน) แต่เป็นViewธุรกิจของการเลือก drawable ตามนั้น
สามารถทำได้ค่อนข้างง่ายด้วยDataBinding :
<ImageView
...
app:src="@{viewModel.isOn ? @drawable/switch_on : @drawable/switch_off}"
/>
หากคุณมีสถานะและสิ่งที่วาดได้มากขึ้นเพื่อหลีกเลี่ยงตรรกะที่ยุ่งยากในไฟล์เลย์เอาต์คุณสามารถเขียนBindingAdapterแบบกำหนดเองที่แปลพูดEnumค่าเป็นR.drawable.*(เช่นชุดการ์ด)
หรือบางทีคุณอาจจำเป็นต้องมีContextองค์ประกอบบางอย่างที่คุณใช้ภายในของคุณViewModel- แล้วสร้างองค์ประกอบภายนอกViewModel. และผ่านมันคุณสามารถใช้ DI หรือ singletons หรือสร้างContextขวาองค์ประกอบ -dependent ก่อน initialising ViewModelใน/FragmentActivity
ทำไมต้องกังวล: Contextเป็นสิ่งเฉพาะของ Android และขึ้นอยู่กับสิ่งที่อยู่ในViewModels เป็นแนวทางปฏิบัติที่ไม่ดี: พวกเขายืนอยู่ในลักษณะของการทดสอบหน่วย ในทางกลับกันอินเทอร์เฟซคอมโพเนนต์ / บริการของคุณเองอยู่ภายใต้การควบคุมของคุณอย่างเต็มที่ดังนั้นคุณจึงสามารถจำลองเพื่อทดสอบ
     
              
AndroidViewModelแต่ได้รับCannot create instance exceptionคุณสามารถอ้างถึงคำตอบนี้ของฉันstackoverflow.com/a/62626408/1055241