如何在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在方向更改时保留(并泄漏("活动"。在ViewModel中保留Activity对象是一个巨大的反模式,应该避免。

相反,您应该使用不同版本的Firebase API。根据API文档,选择一个不接受"活动"的替代方案。一旦API完成,您就可以向托管活动弹出回调,以启动任何其他活动。

首先,根据官方视图模型指南:

注意: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初始化存储库。

  • 如果您的工作与任何UI无关,则可以使用AndroidViewModel而不是ViewModel

  • AndroidViewModel中,有一个重要的默认参数ApplicationContext

  • 或者,如果您想要任何特定的活动References,则在初始化类中的ViewModel时使用LiveData<YourActivity>并设置类引用

最新更新