[英]How to wait till LiveData of a ViewModel is retrieved
在我的 android 應用程序中,我有一個片段,其中包含一個帶有兩個子片段的視圖尋呼機。 該應用程序使用 firebase。 我正在嘗試根據在第一個子片段上選擇的值對第二個子片段運行查詢。 該值通過 ViewModel 傳遞給第二個值。 但是當我運行我的應用程序時,它由於以下錯誤而崩潰:“java.lang.NullPointerException: Can't pass null for argument 'pathString' in child()”。 如何讓我的應用程序等到從 ViewModel 檢索和分配值
視圖模型代碼:
public class AppointmentBookingViewModel extends ViewModel
{
private static MutableLiveData<String> mName = new MutableLiveData<>();
public void setBarberSchedules(String name)
{
mName.setValue(name);
}
public static LiveData<String> getBarberSchedules()
{
return mName;
}
}
第一個子片段:
booktv.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
AppointmentBookingFragment.toNextViewpagerPage();
appointmentBookingViewModel.setBarberSchedules(itemRef.getKey());
}
});
第二個孩子片段:
@Override
public void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
appointmentBookingViewModel = new ViewModelProvider(getParentFragment()).get(AppointmentBookingViewModel.class);
AppointmentBookingViewModel.getBarberSchedules().observe(requireActivity(), new Observer<String>()
{
@Override
public void onChanged(@Nullable String s)
{
barberId = s;
/*Toast toast = Toast.makeText(getActivity().getApplicationContext(), s, Toast.LENGTH_SHORT);
toast.show();*/
}
});
}
@Override
public void onStart()
{
super.onStart();
Query query = FirebaseDatabase.getInstance().getReference().child("Users").child("Barbers").child(barberId).child("TimeSlots").child("Day 1").orderByChild("id");
// this is where the error occurs due to barberId being null when this line is executed
發生這種情況是因為您正在實例化FirebaseDatabase
而barberId
尚未設置
只需移動這條線
Query query = FirebaseDatabase.getInstance().getReference().child("Users").child("Barbers").child(barberId).child("TimeSlots").child("Day 1").orderByChild("id");
到onChanged
回調
@Override
public void onChanged(@Nullable String s)
{
barberId = s;
Query query = FirebaseDatabase.getInstance().getReference().child("Users").child("Barbers").child(barberId).child("TimeSlots").child("Day 1").orderByChild("id"); // Here
/*Toast toast =
Toast.makeText(getActivity().getApplicationContext(), s, Toast.LENGTH_SHORT);
toast.show();*/
}
然后在成功檢索數據后會調用FirebaseDatabase
進程
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.