ดังที่คนอื่น ๆ กล่าวถึงมีAndroidViewModel
สิ่งที่คุณสามารถได้รับจากการรับแอปContext
แต่จากสิ่งที่ฉันรวบรวมในความคิดเห็นคุณกำลังพยายามจัดการ@drawable
s จากภายในของคุณViewModel
ซึ่งเอาชนะจุดประสงค์ MVVM
โดยทั่วไปจำเป็นที่จะต้องมีContext
ในของคุณViewModel
เกือบทุกแห่งแนะนำให้คุณควรพิจารณาทบทวนวิธีการที่คุณแบ่งตรรกะระหว่างคุณและView
ViewModels
แทนที่จะมีการ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
ใน/Fragment
Activity
ทำไมต้องกังวล: Context
เป็นสิ่งเฉพาะของ Android และขึ้นอยู่กับสิ่งที่อยู่ในViewModel
s เป็นแนวทางปฏิบัติที่ไม่ดี: พวกเขายืนอยู่ในลักษณะของการทดสอบหน่วย ในทางกลับกันอินเทอร์เฟซคอมโพเนนต์ / บริการของคุณเองอยู่ภายใต้การควบคุมของคุณอย่างเต็มที่ดังนั้นคุณจึงสามารถจำลองเพื่อทดสอบ
AndroidViewModel
แต่ได้รับCannot create instance exception
คุณสามารถอ้างถึงคำตอบนี้ของฉันstackoverflow.com/a/62626408/1055241