я работаю над проектом, в котором я пытаюсь реализовать компоненты архитектуры Android с привязкой данных. У меня есть активность, модель представления и репозиторий, и я прямо сейчас создаю страницу входа. Мне нужно сделать две функции репозитория, чтобы пользователь мог войти в систему, первая функция вернет uid, и, передав этот uid, вторая функция вернет детали. как только все будет сделано, я хочу перенаправить пользователя на внутреннюю страницу. Я пробовал с Transformations.switchMap, но он не работает. Пожалуйста помоги...
public class LoginViewModel extends ViewModel {
private final VendorRepository vendorRepository;
private final ResourceProvider resourceProvider;
public MutableLiveData<String> error = new MutableLiveData<>();
public MutableLiveData<Boolean> loading = new MutableLiveData<>();
private MutableLiveData<Resource<String>> vendorId = new MutableLiveData<>();
public LiveData<Resource<Vendor>> vendor;
public LoginViewModel() {
this.vendorRepository = VendorRepository.getInstance();
this.resourceProvider = ResourceProvider.getInstance();
/*vendor = Transformations.switchMap(vendorId, new Function<Resource<String>, LiveData<Resource<Vendor>>>() {
@Override
public LiveData<Resource<Vendor>> apply(Resource<String> input) {
if (input!=null&&input.status.equals(Status.SUCCESS))
return vendorRepository.getVendor(vendorId.getValue().data);
else return null;
}
});*/
}
/**
* called when a user clicks on the login button
* if the inputs are valid, will call the login function
*
* @param email entered email
* @param password entered password
*/
public void onClickLogin(String email, String password) {
//loading.setValue(true);
if (validInputs(email, password)) {
vendorId = vendorRepository.login(
email, password
);
} else loading.setValue(false);
}}
Это моя модель просмотра
public class VendorRepository {
private static VendorRepository INSTANCE;
private FirebaseAuth firebaseAuth;
private FirebaseFirestore firebaseFirestore;
public static VendorRepository getInstance() {
if (INSTANCE == null)
INSTANCE = new VendorRepository();
return INSTANCE;
}
private VendorRepository() {
this.firebaseAuth = FirebaseAuth.getInstance();
this.firebaseFirestore = FirebaseFirestore.getInstance();
}
public MutableLiveData<Resource<String>> login(String email, String password) {
final MutableLiveData<Resource<String>> data = new MutableLiveData<>();
data.setValue(Resource.<String>loading(null));
firebaseAuth
.signInWithEmailAndPassword(email, password)
.addOnCompleteListener(new OnCompleteListener<AuthResult>() {
@Override
public void onComplete(@NonNull Task<AuthResult> task) {
if (task.isSuccessful()) {
data.postValue(Resource.success(task.getResult().getUser().getUid()));
} else {
data.postValue(Resource.<String>error(task.getException().getMessage(), null));
}
}
});
return data;
}
public LiveData<Resource<Vendor>> getVendor(String id) {
final MutableLiveData<Resource<Vendor>> data = new MutableLiveData<>();
data.postValue(Resource.<Vendor>loading(null));
firebaseFirestore
.collection(DB_VENDOR)
.document(id)
.get()
.addOnCompleteListener(new OnCompleteListener<DocumentSnapshot>() {
@Override
public void onComplete(@NonNull Task<DocumentSnapshot> task) {
if (task.isSuccessful()) {
Vendor vendor = task.getResult().toObject(Vendor.class);
data.postValue(Resource.success(vendor));
} else {
data.postValue(Resource.<Vendor>error(task.getException().getMessage(), null));
}
}
});
return data;
} }
это мой репозиторий
getVendor
илиlogin
? Можете ли вы вставить трассировку стека в вопрос? - person Rajan Prasad   schedule 11.07.2018vendorId = vendorRepository.login
. Кроме того, проверьте интерфейсOnCompleteListener
, чтобы узнать, отсутствуют ли какие-либо другие методы обратного вызова. Наконец, поместите журнал (что-то вродеLog.d("myclass", "inside method...");
во все методы обратного вызова, которые вы реализуете вOnCompleteListener
внутри методаlogin
. Вы также можете в другом потоке продолжать спать в течение нескольких мс и после каждого пробуждения проверять, является лиvendorId.getValue
null
или нет . - person Rajan Prasad   schedule 11.07.2018VendorRepository.getInstance().getVendor( vendorId)
в наблюдателе самихvendorId
живых данных. - person Rajan Prasad   schedule 11.07.2018getVendor
, в экземплярFunction<String, Livedata<Vendor>
, но я не вижу в этом необходимости. - person Rajan Prasad   schedule 11.07.2018activity
. В противном случае вам придется передавать ссылкуthis
активности везде, где вы создаете наблюдателя. Поверьте мне, вам не нужно беспокоиться об утечке памяти, создав анонимный класс для наблюдателя в действии. В соответствии с тем, как спроектированы ViewModels, наблюдатель будет отсоединен и впоследствии уничтожен, как только действие будет уничтожено. Вы можете прочитать об этом в руководстве для разработчиков Android по ViewModels и LiveData. - person Rajan Prasad   schedule 11.07.2018