Вложенный фрагмент ViewModelProvider не может получать данные - PullRequest
0 голосов
/ 19 июня 2020

Ниже представлена ​​структура моего приложения

MainActivity
|-- HomeFragment
|   |-- ViewPager
|       |-- FirstViewFragement
|       |-- SecondViewFragementme
|       |-- ThirdViewFragement
|-- SettingFragment
|-- OtherFragment

Поток приложения отображается ниже визуально, если требуется.

enter image description here

Описание : у меня есть DataViewModel, который позволяет моему приложению отправлять данные из MainActivity и другого фрагмента в другой фрагмент или дочерний фрагмент.

В моей модели DataViewModel у меня есть два данных, которые мне нужно отправить в CanvasView (расширяет представление) в представлениях внутри окна просмотра. Первые данные поступают из MainActivity (данные датчика), а другие данные поступают из HomeFragment (данные состояния) в представления внутри viewPager. CanvasView <внутри каждого <view внутри <viewpager получает данные от Mainactivty и HomeFragment. Эти представления получают данные в зависимости от того, какой вид виден пользователю. (<em> Я просто проверяю текущую позицию viewpager и отправляю позицию наблюдателю viewmodel внутри этого CanvasView и получаю данные ).

Проблема : Когда я запускаю приложение в первый раз, я получаю данные на firstViewFragment, но как только я смахиваю, я больше не могу получать данные в наблюдателе этих CanvasView , кроме последнего. Последний всегда получает данные независимо от того, сколько раз я смахиваю, но предыдущие представления перестают получать данные.

/* MainActivity.class*/
private FusionViewModel fusionViewModel;
dataViewModel = new ViewModelProvider(this).get(DataViewModel.class); // passing 'this' as an owner in main activity. 

if(sensor.data()>0){
   dataViewModel.setState(true);  
}

    /*CanvasView extends View*/
    private FusionViewModel fusionViewModel; 

    dataViewModel= new ViewModelProvider((ViewModelStoreOwner) ctx).get(DataViewModel.class); // tried getContext() works as well as with ctx. 
    dataViewModel.getState().observe((LifecycleOwner) ctx, new Observer<Boolean>() {
            @Override
            public void onChanged(@Nullable Boolean bool) {
                if(viewPagerPosition==0){
                    pressed=bool;
                    Log.d("STATE","Received");
                }
            }
        });



...