我正在使用通过apollo-android从graphql服务器获取数据的应用程序。
我在aws rds数据库中进行了一次访存。我在我的CalendarFragment的onCreate()
处执行此操作。
事情是,在onViewCreated()
,我想将textview设置为获取的字段之一,名字和姓氏。因此,我运行我的getBarberFullName
方法,该方法返回String
的mBarberFullName
值。当视图模型处理所有逻辑方法时,我尝试遵循UI控制器的显示。 getBarberFullName
驻留在我的ViewModel中。
public String getBarberFullName() {
if (appointmentsAreNull()) return mBarberFullName.getValue();
AppointmentModel am = mMasterAppointments.getValue().get(0);
String fullName = am.bFirstName;
fullName = fullName.concat(" " + am.bLastName);
// Get the logged in barber's full name and set it as mBarberFullName.
mBarberFullName.setValue(fullName);
return mBarberFullName.getValue();
}
其中mMasterAppointments
是MutableLiveData<List<AppointmentModel>>
。在我的onViewCreated()
回调中,运行
String barberName = mBarberViewModel.getBarberFullName();
mTxtv_barberName.setText(barberName);
但是,mMasterAppointments
始终为null,因此它仅返回mBarberFullName的默认值,即String
。
但是,如果我在相同的onViewCreated()
上运行以下代码,则在使用所需的理发师的全名更新textview时,将获得所需的结果。
mBarberViewModel.getAllAppointments().observe(getViewLifecycleOwner(), am -> {
if (am.isEmpty()) {
Log.d(TAG, "No barber.");
return;
}
String barberGreeting;
barberGreeting = am.get(0).bFirstName;
barberGreeting = barberGreeting.concat(" " + am.get(0).bLastName);
mTxtv_barberName.setText(barberGreeting);
});
getAllAppointments
将观察者返回到位于我的ViewModel中的mMasterAppointments
。
尽管在getAllAppointments
中调用了getBarberFullName
和onViewCreated()
,但一个可以访问mMasterAppointments
的待定值,而另一个则不能。为什么?
我不想在片段onViewCreated
回调中执行逻辑,那么如何在ViewModel的mMasterApointmentData
中等待未决的getBarberFullName()
? LiveData
和ViewModel
中是否有在这种情况下对我有帮助的工具?
为此使用LiveData的Transformations类。
[首先在viewmdoel中为BarberFullName
添加一个新的LiveData变量,并为它提供转换(映射)源LiveData mMasterAppointments
的值:
val fullBarberName: LiveData<String> = Transformations.map(mMasterAppointments) { am ->
" ${am[0].bFirstName} ${am.get(0).bLastName}"
}
现在,您可以在片段中观察此String LiveData,就像您制作第二个片段的方式一样。
请注意,我提供的代码在Kotlin中,我现在使用它。我希望你能得到它。