คำถามติดแท็ก android-viewmodel

22
ViewModelProviders เลิกใช้แล้วใน 1.1.0
มองไปที่เอกสารของ GoogleสำหรับViewModelพวกเขาแสดงให้เห็นด้านล่างโค้ดตัวอย่างเกี่ยวกับวิธีการที่จะได้รับViewModel: val model = ViewModelProviders.of(this).get(MyViewModel::class.java) เมื่อใช้การพึ่งพาล่าสุดไม่มีระดับดังกล่าวandroid.arch.lifecycle:extensions:1.1.1ViewModelProviders ไปที่เอกสารสำหรับViewModelProvidersฉันเห็นความคิดเห็นว่า: คลาสนี้เลิกใช้แล้วในระดับ API 1.1.0 ใช้ ViewModelProvider.AndroidViewModelFactory ปัญหาคือเมื่อพยายามใช้ViewModelProvider.AndroidViewModelFactoryไม่พบofวิธีการที่เทียบเท่าเพื่อรับอินสแตนซ์ของไฟล์ViewModel. สิ่งที่ฉันพยายามทำ: ViewModelProvider.AndroidViewModelFactory.getInstance(application).create(PlayerViewHolder::class.java) ดังนั้นชื่อของเมธอดcreateฉันจึงได้รับอินสแตนซ์ใหม่ของ ViewModel ทุกครั้งที่เรียกมันซึ่งไม่ใช่สิ่งที่ฉันเป็น มีความคิดใดบ้างที่จะแทนที่โค้ดที่เลิกใช้งานด้านบน

3
AndroidViewModel vs ViewModel
ด้วยการแนะนำของห้องสมุด Android สถาปัตยกรรมองค์ประกอบในชั้นเรียนใหม่ ๆ ที่ถูกนำมารวมทั้งและAndroidViewModel ViewModelอย่างไรก็ตามฉันมีปัญหาในการค้นหาความแตกต่างระหว่างสองคลาสนี้ เอกสารชัดถ้อยชัดคำอธิบายAndroidViewModelดังต่อไปนี้: แอปพลิเคชันตระหนักถึงบริบท ViewModel ฉันซาบซึ้งในความกะทัดรัด แต่สิ่งนี้บอกเป็นนัย ๆ ว่าอะไร? เมื่อเราควรเลือกที่จะใช้AndroidViewModelมากกว่าViewModelและในทางกลับกัน?

4
การสังเกต LiveData จาก ViewModel
ฉันมีคลาสแยกต่างหากที่ฉันจัดการการดึงข้อมูล (โดยเฉพาะ Firebase) และฉันมักจะส่งคืนออบเจ็กต์ LiveData จากมันและอัปเดตแบบอะซิงโครนัส ตอนนี้ฉันต้องการเก็บข้อมูลที่ส่งคืนไว้ใน ViewModel แต่ปัญหาคือเพื่อให้ได้ค่าดังกล่าวฉันต้องสังเกตวัตถุ LiveData ที่ส่งคืนจากคลาสการดึงข้อมูลของฉัน วิธีการสังเกตการณ์ต้องการวัตถุ LifecycleOwner เป็นพารามิเตอร์แรก แต่เห็นได้ชัดว่าฉันไม่มีสิ่งนั้นอยู่ใน ViewModel ของฉันและฉันรู้ว่าฉันไม่ควรเก็บการอ้างอิงถึง Activity / Fragment ภายใน ViewModel ฉันควรทำอย่างไรดี?

2
ใช้ viewLifecycleOwner เป็น LifecycleOwner
ฉันมีชิ้นส่วน: class MyFragment : BaseFragment() { // my StudentsViewModel instance lateinit var viewModel: StudentsViewModel override fun onCreateView(...){ ... } override fun onViewCreated(view: View, savedInstanceState: Bundle?) { super.onViewCreated(view, savedInstanceState) viewModel = ViewModelProviders.of(this).get(StudentsViewModel::class.java) updateStudentList() } fun updateStudentList() { // Compiler error on 'this': Use viewLifecycleOwner as the LifecycleOwner viewModel.students.observe(this, Observer { //TODO: …

1
ViewModelStore และ viewModelStoreOwner คืออะไร
ฉันสับสนมากเนื่องจาก ViewModelProvider api ใหม่นี้ (ViewModelProviders เลิกใช้แล้ว) เช่นเดียวกับการเปลี่ยนแปลงใหม่มี Constructors ใหม่ด้วย (ซอร์สโค้ด) # 1 public ViewModelProvider(@NonNull ViewModelStoreOwner owner) { this(owner.getViewModelStore(), owner instanceof HasDefaultViewModelProviderFactory ? ((HasDefaultViewModelProviderFactory) owner).getDefaultViewModelProviderFactory() : NewInstanceFactory.getInstance()); } # 2 public ViewModelProvider(@NonNull ViewModelStoreOwner owner, @NonNull Factory factory) { this(owner.getViewModelStore(), factory); } # 3 public ViewModelProvider(@NonNull ViewModelStore store, @NonNull Factory factory) { …

1
ปัญหา ViewPager2 / แท็บกับสถานะ ViewModel
ฉันกำลังติดตามรูปแบบ MVVM - หมายถึงฉันมี ViewModel สำหรับแต่ละส่วน ฉันเพิ่มสองแท็บโดยใช้ ViewPager2 อะแดปเตอร์ของฉันมีลักษณะเช่นนี้: @Override public Fragment createFragment(int position) { switch (position) { case 0: return new MergedItemsFragment(); case 1: return new ValidatedMergedItemsFragment(); } return new MergedItemsFragment(); } แท็บกำลังทำงาน อย่างไรก็ตามฉันสังเกตเห็นว่า ViewModel ของ MergedItemsFragment ของฉันทำงานผิดปกติ ก่อนที่ฉันจะเพิ่มแท็บฉันไปที่ Fragment เช่นนี้: NavHostFragment.findNavController(this).navigate(R.id.action_roomFragment_to_itemsFragment); เมื่อฉันออกจากส่วนนั้นด้วยNavHostFragment.findNavController(this).popBackStack()และหลังจากนั้นกลับสู่ชิ้นส่วนนั้นฉันจะได้รับ ViewModel ที่ว่างเปล่าใหม่ นี่ตั้งใจไว้ return new MergedItemsFragment()ด้วยวิธีการใหม่ฉันกำลังการนำทางด้วย …
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.