如何在DialogFragment中观察ViewModel LiveData?

时间:2019-11-24 17:49:32

标签: android android-fragments android-dialogfragment

我想在一个片段和一个dialogFragment之间共享一个ViewModel。在启动DialogFragment之前,我使用setter方法更新了ViewModel liveData。当我尝试观察DialogFragment中的值时,该值为null。我尝试通过捆绑包的包裹发送该值,并且可以正常工作。

这就是我从片段中呼叫的方式,

<p><a (click)="addToBasket(product)" [routerLink]="[product/product.product_id]">Buy</a></p>

对话框片段:

myViewModel.setBitmap(myResult.getBitmap());
            BottomSheetFragment bottomSheetFragment = BottomSheetFragment.getNewInstance(args);
            bottomSheetFragment.setTargetFragment(this, EDIT_FROM_OVERLAY);
            bottomSheetFragment.setListener(this);
            bottomSheetFragment.show(fragmentManager, BottomSheetFragment.TAG);

我也尝试在onCreateDialog方法中初始化ViewModel。结果还是一样。我想通过ViewModel从片段发送一个位图到dialogFragment。我在这里想念什么?为什么无法在dialogFragment中获取在片段中设置的位图图像?任何指针都会有所帮助。

谢谢

更新: 添加View模型代码,

@Override
    public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState)
    {
        super.onViewCreated(view, savedInstanceState);

        myViewModel = ViewModelProviders.of(getActivity()).get(MyViewModel.class);
        myViewModel.getBitMap().observe(this, bitmap ->
        {
            dialogBitmap = bitmap;
        });

        imageView = view.findViewById(R.id.overlay_image);
        imageView.setImageBitmap(dialogBitmap);
    }

3 个答案:

答案 0 :(得分:0)

这是因为您在创建dialogFragment之前设置了liveData值。

执行此操作  myViewModel.setBitmap(myResult.getBitmap());bottomSheetFragment.show(fragmentManager, BottomSheetFragment.TAG);

答案 1 :(得分:0)

@Ali Rezaiyan的建议使我意识到,我并没有马上设定价值。 所以我将设置位图移入对话框片段中的观察中。

bitmapViewModel.getBitmap().observe(this, bitmap ->
        {
            imageView.setImageBitmap(bitmap);
        });

在此处添加它以供将来参考。

答案 2 :(得分:0)

您这样做的方式是错误的。使用您的方法,执行blockStepVerifier / Flux的值始终为空。

更好的方法是将bitmap调用放入LiveData观察调用中。另外,记住始终检查是否为空。这是一个代码片段,说明了我的意思:

dialogBitmap

我希望这会有所帮助。快活的编码!