【发布时间】:2017-09-26 14:42:07
【问题描述】:
我在我的项目中使用了 android AAC 库和 Android 数据绑定库。我有 AuthActivity 和 AuthViewModel 扩展了 android 的 ViewModel 类。在某些情况下,我需要让 Activity 为 ViewModel 调用一些方法。 例如,当用户单击在 Activity 类中初始化的 Google Auth 或 Facebook Auth 按钮时(因为要初始化 GoogleApiClient,我需要无法传递给 ViewModel 的 Activity 上下文,视图模型无法存储 Activity 字段)。 Google Api 和 Facebook API 的所有逻辑都在 Activity 类中实现:
//google api initialization
googleApiClient = new GoogleApiClient.Builder(this)
.enableAutoManage(this, this)
.addApi(Auth.GOOGLE_SIGN_IN_API, gso)
.build();
//facebook login button
loginButton.setReadPermissions(Arrays.asList("email", "public_profile"));
loginButton.registerCallback(callbackManager,
我还需要调用登录意图,这也需要 Activity 上下文:
Intent signInIntent = Auth.GoogleSignInApi.getSignInIntent(googleApiClient);
startActivityForResult(signInIntent, GOOGLE_AUTH);
我无法从视图模型类请求 facebook 登录和 google 登录,或 startActivity 意图,所以我创建了类接口 AuthActivityListener:
public interface AuthActivityListener {
void requestSignedIn();
void requestGoogleAuth();
void requestFacebookAuth();
void requestShowDialogFragment(int type);
}
在活动类中实现监听器:
AuthActivityRequester authRequestListener = new AuthActivityRequester() {
@Override
public void requestSignedIn() {
Intent intent = new Intent(AuthActivity.this, ScanActivity.class);
startActivity(intent);
AuthActivity.this.finish();
}
@Override
public void requestGoogleAuth() {
Intent signInIntent = Auth.GoogleSignInApi.getSignInIntent(googleApiClient);
startActivityForResult(signInIntent, GOOGLE_AUTH);
}
...
并在视图模型类中分配此侦听器以调用活动方法:
// in constructor
this.authRequester = listener;
// call activity method
public void onClickedAuthGoogle() {
authRequester.requestGoogleAuth();
}
通过 google 或 facebook 身份验证后,我从活动中调用视图模型方法:
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
callbackManager.onActivityResult(requestCode, resultCode, data);
if (requestCode == GOOGLE_AUTH) {
GoogleSignInResult result = Auth.GoogleSignInApi.getSignInResultFromIntent(data);
if (result.isSuccess()) {
GoogleSignInAccount acct = result.getSignInAccount();
if (acct != null) {
viewModel.onGoogleUserLoaded(acct.getEmail(), acct.getId());
} else {
viewModel.onGoogleUserLoaded("", "");
}
}
}
}
谁能解释一下视图模型和活动之间的这种通信方法是否正确,或者我需要找到另一种方式从视图模型中调用活动方法?
【问题讨论】:
-
嘿,您找到适合 Google 和 Facebook 登录的 MVVM 结构了吗?我正在寻找相同的结构。
-
面临同样的问题..想了解您是如何解决的..
-
有没有人为此找到另一个解决方案,我们不必将引用从 View 传递给 ViewModel?
-
如果有人遇到,请参阅this。
-
我认为如果外部 API 以这种方式设计,则可以进行异常处理并让活动处理流程。目标应该是实现一个解决方案,该解决方案遵循框架组件的生命周期,并以优雅的方式初始化/终止对象和服务,而不会泄漏资源。 MVVM 是一种方法,但您自己的解决方案也可以正常工作。
标签: android android-activity mvvm listener viewmodel