Невозможно оценить глобальную переменную String вне OnCompleteListener DocumentReference FirebaseFirestore [duplicate]

В PHP существует очень простой метод: один метод:

(count (array_count_values ​​($ array)) == 1)

Например:

$arr1 = ['a', 'a', 'a', 'a'];
$arr2 = ['a', 'a', 'b', 'a'];


print (count(array_count_values($arr1)) == 1 ? "identical" : "not identical"); // identical
print (count(array_count_values($arr2)) == 1 ? "identical" : "not identical"); // not identical

Вот и все.

7
задан Sneh Pandya 29 January 2018 в 11:46
поделиться

1 ответ

Вы не можете вернуть то, что еще не загружено. Firestore загружает данные asynchronously, так как для этого может потребоваться некоторое время. В зависимости от скорости соединения и состояния, может потребоваться от нескольких сотен миллисекунд до нескольких секунд, прежде чем эти данные будут доступны. Если вы хотите передать объект settings другому методу, просто вызовите этот метод внутри метода onSuccess() и передайте этот объект в качестве аргумента. Таким образом, быстрое исправление будет следующим:

@Override
public void onSuccess(DocumentSnapshot documentSnapshot) {
    UserAccountSettings settings = documentSnapshot.toObject(UserAccountSettings.class);
    yourMethod(settings);
}

Еще одно замечание: вам не нужно устанавливать эти значения для объекта, который уже имеет их. Вы уже получаете данные из базы данных в качестве объекта.

Так что помните, что метод onSuccess() имеет асинхронное поведение, а это означает, что вызывается еще до того, как вы получите данные из своего база данных. Если вы хотите использовать объект settings вне этого метода, вам нужно создать свой собственный callback. Для этого сначала нужно создать такой интерфейс:

public interface MyCallback {
    void onCallback(UserAccountSettings settings);
}

Затем вам нужно создать метод, который фактически получает данные из базы данных. Этот метод должен выглядеть так:

public void readData(MyCallback myCallback) {
    DocumentReference mSettings = mFirebaseFirestore.collection("user_account_settings").document(userID);
    mSettings.get().addOnSuccessListener(new OnSuccessListener<DocumentSnapshot>() {
        @Override
        public void onSuccess(DocumentSnapshot documentSnapshot) {
            UserAccountSettings settings = documentSnapshot.toObject(UserAccountSettings.class);
            myCallback.onCallback(settings);

        }
    });
}

. В конце просто просто вызовите метод readData() и передайте экземпляр интерфейса MyCallback в качестве аргумента везде, где вам это нужно:

readData(new MyCallback() {
    @Override
    public void onCallback(UserAccountSettings settings) {
        Log.d("TAG", settings.getDisplay_name());
    }
});

Это единственный способ, которым вы можете использовать этот объект класса UserAccountSettings вне метода onSuccess(). Для получения дополнительной информации вы также можете посмотреть видео .

11
ответ дан Alex Mamo 15 August 2018 в 16:55
поделиться
Другие вопросы по тегам:

Похожие вопросы: