เมื่อคื Viewmodel น constructor เรียกว่าอยู่ใน Android?

0

คำถาม

ฉันกำลังจะผ่านเรื่องนี้ codelab: https://developer.android.com/codelabs/android-lifecycles#6 มันอธิบายวิธีใช้ SavedStateHandle ใน ViewModel จะรอดระบวนการตาย ที่ constructor ของ ViewModel คือที่ด้านล่างนี้:

    private SavedStateHandle mState;

    public SavedStateViewModel(SavedStateHandle savedStateHandle) {
       mState = savedStateHandle;
    }

และ viewmodel เป็นสามารถใช้ถอยู่ในกิจกรรมตาม:

    mSavedStateViewModel = new ViewModelProvider(this).get(SavedStateViewModel.class);

เมื่อคื ViewModel น constructor เรียกหาฉันเหรอ? และยังไงที่ Viewmodel ได้ savedStateHandle พารามิเตอร์ของ ViewModel?

แก้ไข:

ฉันเจอคำตอบคำถามของผมองผ่านเรื่องนี้ blogpost: https://www.rockandnull.com/viewmodel-savedstate/

มันบอกว่าถ้าSavedStateHandle เป็นเพียงคนเดียวพารามิเตอร์ของเรา viewmodel น constructor ง by viewModels วแทนให้มันไป viewmodel โดยอัตโนมัติ

อย่างไรก็ตาม ถ้าพวกเรามีกับส่วนผสมขอกำหนดค่าพารามิเตอร์ที่ให้โดยการขึ้นแก่กันเรื่องการฉีดเฟรมเวิร์ก(Hilt)e.เจ้าหน้าที่เก็บเมื่อสองสามอื่นๆ runtime อาร์กิวเมนต์หนึ่งตัว e.จี:เลือกหมวดหมู่หมายเลขและ SavedStateHandle จะช่วยให้พวกเราทุกคนอยู่รอดที่โพรเซสความตายอยู่ใน viewmodel น constructor-แล้วพวกเราจะเป็นยังไงให้พวกนั้นพารามิเตอร์ไปที่โรงงาน?

ได้โปรดโพสต์เล็กๆตัวอย่างเช่นสำหรับความเข้าใจของฉัน

android android-lifecycle viewmodel
2021-11-24 03:13:47
1

คำตอบที่ดีที่สุด

4

ที่ Codelab คุณกำลังตามดูอยู่คือทำให้คุณเข้าใจข้อสงครามแย่งชิงยุทธศาสแทนที่จะเป็น ทั้งรหัสมอส ไม่ implementation อย่างโดยพวกเขาเกี่ยวกับของคุณสงสัยซึ่งได้อย่างไร ViewModel ให้มันเป็นพารามิเตอร์?


เนื้อหาโดยรวม: เนื่องจากแน่นอนภายใน implementation ของ ViewModel คุณไม่สามารถส่งอาร์กิวเมนต์ที่ ViewModel โดยตรงแทนที่คุณต้องการเพื่อสร้างเป็นคาบเรียนที่สามซึ่งมีคนพารามิเตอร์ที่ ViewModel.


คำตอบต้องสงสัยของคุณ:

มีสอนมาผ่านทางซึ่งเป็น ViewModel สามารถเอามันคือพารามิเตอร์:

  1. ไม่มีการขึ้นแก่กันว่าถูกฉีดโดยทาง: นี่คุณสร้างชั้นเรียนคนหนึ่งยื่นมือไปช่วย ViewModelProvider.โรงงาน อยู่ในรหัสของคุณ,คุณสามารถเห็น:
  mSavedStateViewModel = new ViewModelProvider(this).get(SavedStateViewModel.class);

นี่เป็นค่าปริยายคือชั้นเรียนถูกสร้าง wherein ไม่มีอาร์กิวเมนต์หนึ่งตัวเป็นผ่านพ้นไปแล้วนี่คือจบสำหรับวัตถุประสงค์ของ initialization ซึ่งเป็นข้อยังไม่สมบูรณ์แบบใน codelab นต้องแสดงถึงความสนที่ต้องการ คุณสามารถได้จำนวนมากของความรู้อยู่คนเดียวกับสงครามแย่งชิงยุทธศาสผ่านทางข่าวนี้:

https://medium.com/koderlabs/viewmodel-with-viewmodelprovider-factory-the-creator-of-viewmodel-8fabfec1aa4f

  1. การขึ้นแก่กันว่าถูกฉีดโดยทาง: ตอนนี้,นี่เป็นงานง่ายสุดทางที่จะเตรียมกำหนด ViewModelProviders ถ้าคุณรู้ว่าไดเฟรมเวิร์ก Hilt. นี่คุณแค่ต้องการ annotate ของคุณ ViewModel กับ@ViewModelInject และคุณเป็นคนทำที่ไดเฟรมเวิร์กอยู่ใน backgroun จะสร้าง ViewModelFactory แทนที่จะเป็นของคุณทำมันนี่เป็นตัวอย่างรหัสของคุณให้พารามิเตอร์ต้อง ViewModel ใช้ Hilt:

class SampleViewModel @ViewModelInject constructor(
                     @Assisted private val savedStateHandle: SavedStateHandle) : ViewModel() { }
2021-11-24 04:17:44

ฉันต้อง debugged แอพฯจาก codelab. มันเป็น constructor ถูกเรียกว่าถึงแม้ฉันจะไม่จากไปไหนโรงงาน มันจะเป็นไปได้ยังไง? ใครที่ผ่านไปที่ SavedStateHandle ที่ constructor?
Neeraja Gandla

คุณสามารถแบ่งปันการเชื่อมต่อไปที่โปรแกรม? คุณประมวลผลโปรแกรมในท้องถิ่นบ Android สตูดิโอหรอ? เพราะ github เชื่อมโยงไปยังกฎการกล่าวถึงในพ codelab นพูดถึงเรื่องบางอย่า usecases และพวกขอทางออกไม่มีเต็มไปด้ว fledged ทางออกเหมือนเป็นสมบูรณ์โปรแกรม
Karunesh Palekar

คุณสามารถดาวน์โหลดงซอร์สโค้ดตัวนี้จากที่นี่: developer.android.com/codelabs/android-lifecycles#1
Neeraja Gandla

ยังโปรดดูที่แก้ไขส่วนของคำถาม
Neeraja Gandla

มีความสุขเธอมีคำตอบของคุณ
Karunesh Palekar

คุณสามารถรที่ซับซ้อนมากกของคุณแก้ไข? ฉันไม่ได้ส่วนผสมที่แน่นอนเนื้อหาที่คุณต้องการจะรู้ ViewModel ให้คุณพิเศษ functionality ของ caching ข้อมูลของคุณสำหรับจอภาพปฐมนิเทศดังนั้นเพื่อให้พวก functionality งกลุ่มผู้พัฒนายต้องหาทาง wherein นี่เป็นครั้งเดียวพวกเขารู้แล้ว เราทั้งหมด android ลุ่มผู้พัฒนายต้องผ่านช่างโหมากมายในอาชีพของเรา,ฉันหวังว่าคุณคงเข้าใจ
Karunesh Palekar

Neeraja Gandla

ในภาษาอื่นๆ

หน้านี้อยู่ในภาษาอื่นๆ

Русский
..................................................................................................................
Italiano
..................................................................................................................
Polski
..................................................................................................................
Română
..................................................................................................................
한국어
..................................................................................................................
हिन्दी
..................................................................................................................
Français
..................................................................................................................
Türk
..................................................................................................................
Česk
..................................................................................................................
Português
..................................................................................................................
中文
..................................................................................................................
Español
..................................................................................................................
Slovenský
..................................................................................................................