我在我的項目中使用了android AAC庫和Android數據綁定庫。我有AuthActivity和AuthViewModel擴展了android的ViewModel類。在某些情況下,我需要請求Activity爲ViewModel調用一些方法。 例如,當用戶點擊在Activity類中初始化的Google Auth或Facebook Auth按鈕(因爲要初始化GoogleApiClient,我需要Activity無法傳遞給ViewModel的Activity上下文,查看模型無法存儲活動字段)。 與谷歌阿比和Facebook API的所有邏輯在活動類實現:Android ViewModel調用活動方法
//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,
此外,我需要調用登錄意圖它需要太多的活動背景:
Intent signInIntent = Auth.GoogleSignInApi.getSignInIntent(googleApiClient);
startActivityForResult(signInIntent, GOOGLE_AUTH);
我不能要求Facebook登錄和谷歌從視圖模型類的登錄,或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();
}
谷歌或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結構?我正在尋找同樣的東西。 – iMDroid