如何等到 ViewModel 的 LiveData 被检索
How to wait till LiveData of a ViewModel is retrieved
在我的 android 应用程序中,我有一个包含带有两个子片段的视图寻呼机的片段。该应用程序使用 Firebase。我正在尝试 运行 根据在第一个子片段上选择的值对第二个子片段进行查询。该值通过 ViewModel 传递给第二个值。但是当我 运行 我的应用程序由于以下错误而崩溃:“java.lang.NullPointerException:无法为 child() 中的参数 'pathString' 传递 null”。我怎样才能让我的应用程序等待,直到从 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
数据获取成功后会调用进程
在我的 android 应用程序中,我有一个包含带有两个子片段的视图寻呼机的片段。该应用程序使用 Firebase。我正在尝试 运行 根据在第一个子片段上选择的值对第二个子片段进行查询。该值通过 ViewModel 传递给第二个值。但是当我 运行 我的应用程序由于以下错误而崩溃:“java.lang.NullPointerException:无法为 child() 中的参数 'pathString' 传递 null”。我怎样才能让我的应用程序等待,直到从 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
数据获取成功后会调用进程