簡體   English   中英

如何等到 ViewModel 的 LiveData 被檢索到

[英]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

發生這種情況是因為您正在實例化FirebaseDatabasebarberId尚未設置

只需移動這條線

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM