使用架构组件等待未决实时数据的最佳方法

问题描述 投票:0回答:1

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

我在aws rds数据库中进行了一次访存。我在我的CalendarFragment的onCreate()处执行此操作。

事情是,在onViewCreated(),我想将textview设置为获取的字段之一,名字和姓氏。因此,我运行我的getBarberFullName方法,该方法返回StringmBarberFullName值。当视图模型处理所有逻辑方法时,我尝试遵循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将观察者返回到位于我的ViewModel中的mMasterAppointments

尽管在getAllAppointments中调用了getBarberFullNameonViewCreated(),但一个可以访问mMasterAppointments的待定值,而另一个则不能。为什么?

我不想在片段onViewCreated回调中执行逻辑,那么如何在ViewModel的mMasterApointmentData中等待未决的getBarberFullName()LiveDataViewModel中是否有在这种情况下对我有帮助的工具?

android android-livedata android-viewmodel apollo-android
1个回答
0
投票

为此使用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中,我现在使用它。我希望你能得到它。

© www.soinside.com 2019 - 2024. All rights reserved.