[英]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
:
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; } }
<application android:name="com.xyz.MyApplication"> </application>
MyApplication.getAppContext()
還可以通過AndroidViewModel
類訪問應用程序上下文。 但我猜你通常不想從你的 ViewModel 初始化你的存儲庫。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.