0

我正在开发一个通过 apollo-android 从 graphql 服务器获取数据的应用程序。

我对我的 aws rds 数据库进行了一次提取。我在onCreate()我的 CalendarFragment 中进行此获取。

问题是,在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();
    }

哪里mMasterAppointmentsMutableLiveData<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返回mMasterAppointments位于我的 ViewModel 中的观察者。

虽然getAllAppointmentsgetBarberFullName在 内被调用onViewCreated(),但一个能够访问 的挂起值,mMasterAppointments而另一个则不能。为什么?

我不想在 FragmentsonViewCreated回调中执行逻辑,那么如何等待mMasterApointmentDataViewModel 中的挂起getBarberFullName()?在这种情况下是否有工具可以帮助LiveData我?ViewModel

4

1 回答 1

1

使用 LiveData 的转换

当您需要执行计算时,仅显示数据的子集,或更改数据的呈现方式。

首先在 viewmdoel 中添加一个新的 String LiveData for BarberFullName,并赋予其将源 LiveData 转换(映射)mMasterAppointments为所需 String 的值:

val fullBarberName: LiveData<String> = Transformations.map(mMasterAppointments) { am ->
         " ${am[0].bFirstName} ${am.get(0).bLastName}" 
}

现在您可以在片段中观察这个 String LiveData,就像您在第二个片段中所做的那样。

请注意,我提供的代码是在 Kotlin 中,我现在使用它。我希望你能明白。

于 2020-05-20T23:35:43.057 回答