簡體   English   中英

如何在 ViewModel Android 中獲取活動上下文?

[英]How to get activity context in ViewModel Android?

我正在使用 MVVM。 我想在應用中實現 Firebase Auth。 但是要實現它,我需要在我的 repo 類中設置一個活動上下文。 如何從 ViewModel 獲取它或者是否有任何簡單的方法可用?

這是我需要實現的 firebase 代碼:

 PhoneAuthProvider.getInstance().verifyPhoneNumber("+91"+phone,        // Phone number to verify
            60,                 // Timeout duration
            TimeUnit.SECONDS,   // Unit of timeout
            (Activity) context,               // Activity (for callback binding)
            new PhoneAuthProvider.OnVerificationStateChangedCallbacks() {
                @Override
                public void onVerificationCompleted(@NonNull PhoneAuthCredential phoneAuthCredential) 
               {
                    signInWithPhoneAuthCredential((Activity)context,phoneAuthCredential);
                }

                @Override
                public void onVerificationFailed(@NonNull FirebaseException e) {
                    setLoginFailed(e);

                }

                @Override
                public void onCodeSent(@NonNull String s, @NonNull 
                PhoneAuthProvider.ForceResendingToken forceResendingToken) {
                    super.onCodeSent(s, forceResendingToken);
                    loginResponse.setOnProgress(false);
                    loginResponse.setStatus(true);
                    loginResponse.setCodeVerified(false);
                    loginResponseLiveData.setValue(loginResponse);
                    verificationId =s;

                }
            });

通常,ViewModel 對象不應引用與 Android 平台 API 相關的任何內容,尤其是 Activity 對象。 您不希望 ViewModel 保留(和泄漏)跨方向更改的 Activity。 在 ViewModel 中保留 Activity 對象是一個應該避免的巨大反模式。

相反,您應該使用該 Firebase API 的不同版本。 根據API 文檔,選擇不采用 Activity 的替代方案之一。 API 完成后,您可以將回調冒泡到托管活動以啟動任何其他活動。

  • 如果您的工作與任何UI無關,那么您可以使用AndroidViewModel而不是ViewModel

  • AndroidViewModel有一個重要的默認參數ApplicationContext

  • 或者,如果您想要任何特定的活動引用,則在類中初始化 ViewModel 時使用LiveData<YourActivity>並設置類引用

首先,根據官方視圖模型指南

注意:ViewModel 絕不能引用視圖、生命周期或任何可能持有對活動內容的引用的類

因此,根據您的 MVVM 架構,不要將您的活動上下文傳遞給 ViewModel

我想在您想要實現的方法中,您不需要特別需要活動上下文。 您還可以使用應用程序的context

按照此答案的以下 3 個步驟靜態訪問您的應用程序context

  1. 在創建時引用context創建應用程序類
    public class MyApplication extends Application { private static Context context; public void onCreate() { super.onCreate(); MyApplication.context = getApplicationContext(); } public static Context getAppContext() { return MyApplication.context; } }
  2. 在您的清單中聲明您的應用程序類
    <application android:name="com.xyz.MyApplication"> </application>
  3. 在您的存儲庫類中靜態訪問此上下文
    MyApplication.getAppContext()

還可以通過AndroidViewModel類訪問應用程序上下文。 但我猜你通常不想從你的 ViewModel 初始化你的存儲庫。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM