[英]Flutter Firebase return a Querysnapshot and DocumentSnapshot in the same widget
[英]How to return a DocumentSnapShot as a result of a method?
一個自定義的 object 參數為 (DocumentSnapShot documentsnapShot)。 也是來自 Firebase 的內部 object 檢索快照並將值設置為我的自定義 model 也有它的參數(DocumentSnapShot 文檔napShot)。 但是,我希望從 Firebase 獲取數據並將其傳遞給我的自定義參數,因為我不僅需要 Firebase 還需要多個數據。 如果沒有覆蓋,就不可能迭代 Firestore。
這是代碼:
public UserSettings getUserSettings(DocumentSnapshot documentSnapshot){
Log.d(TAG, "getUserSettings: retrieving user account settings from firestore");
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);
settings.setDisplay_name(documentSnapshot.getString("display_name"));
settings.setUsername(documentSnapshot.getString("username"));
settings.setWebsite(documentSnapshot.getString("website"));
settings.setProfile_photo(documentSnapshot.getString("profile_photo"));
settings.setPosts(documentSnapshot.getLong("posts"));
settings.setFollowers(documentSnapshot.getLong("followers"));
settings.setFollowing(documentSnapshot.getLong("following"));
}
});
}
您現在無法退回尚未加載的內容。 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());
}
});
這是您可以在onSuccess()
方法之外使用UserAccountSettings
類的該對象的唯一方法。 有關更多信息,您還可以觀看此視頻。
使用LiveData
作為返回類型並觀察其值的變化以執行所需的操作。
private MutableLiveData<UserAccountSettings> userSettingsMutableLiveData = new MutableLiveData<>();
public MutableLiveData<UserAccountSettings> getUserSettings(DocumentSnapshot documentSnapshot){
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);
settings.setDisplay_name(documentSnapshot.getString("display_name"));
settings.setUsername(documentSnapshot.getString("username"));
settings.setWebsite(documentSnapshot.getString("website"));
settings.setProfile_photo(documentSnapshot.getString("profile_photo"));
settings.setPosts(documentSnapshot.getLong("posts"));
settings.setFollowers(documentSnapshot.getLong("followers"));
settings.setFollowing(documentSnapshot.getLong("following"));
userSettingsMutableLiveData.setValue(settings);
}
});
return userSettingsMutableLiveData;
}
然后從您的Activity/Fragment
觀察LiveData
並在onChanged
內部執行您想要的操作。
getUserSettings().observe(this, new Observer<UserAccountSettings>() {
@Override
public void onChanged(UserAccountSettings userAccountSettings) {
//here, do whatever you want on `userAccountSettings`
}
});
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.