通过构造函数将对象传递给多个片段是一种不好的做法吗?
Is passing an object through constructors, to multiple fragments a bad practice?
在我的应用程序中,我有一个 activity,它有一个使用 OrderItems
列表的 RecyclerView 适配器
当用户点击一个项目时,我将对象从我的 RecyclerAdapter
传递到我的 MainActivity 以膨胀 BottomSheetDialog
public class ViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener {
. . .
int position;
ViewHolder(@NonNull View itemView) {
super(itemView);
ButterKnife.bind(this, itemView);
itemView.setOnClickListener(this);
}
@Override
public void onClick(View v) {
. . .
adapterCallback.onOrderItemClick(orderItem);
}
}
public interface OrdersAdapterCallback {
void onOrderItemClick(OrderItem orderItem);
}
在我的 MainActivity
中实现的接口回调方法中,我使用适配器中的对象(第一次传递对象)对 BottomSheetDialog
进行充气
MainActivity
@Override
public void onOrderItemClick(OrderItem orderItem) {
//Object passed from adapter
BottomSheetDialogFragment dialogFragment = BottomSheetOrderFragment.newInstance(orderItem);
dialogFragment.show(getSupportFragmentManager(), Constants.FRAGMENT_BOTTOMSHEET_ORDER);
}
当 BottomSheetDialog
膨胀时,有一个按钮可以关闭当前对话框,并膨胀 FragmentDialog
通过 OrderItem
(但在使用一些设置器之后)再次对象(第二次传递对象)。
Inside the BottomSheetDialog:
private BottomSheetOrderFragment(OrderItem orderItem){
this.orderItem = orderItem;
this.orderItem.setNewOrder("New order string here");
}
@OnClick(R.id.btn_edit_order)
void onEditOrderBtnClick(){
dismiss();
mainActivity.editOrder(this.orderItem);
}
所以目前我们已经将 OrderItem
对象传递给 MainActivity
中的两个不同片段。然后我必须将该对象传递给 MainViewModel
,然后传递给 MainRepo
,其中 RoomDatabase
class 将该对象插入本地数据库。
这最终让 OrderItem
通过它们的构造函数传递给 4 个不同的 classes,并在途中将一些 setter 应用于该对象。我的问题是,这在 Android / OOP 中通常是一种不好的做法吗?还是有更好的方法来实现我想要实现的目标?
My question is, is this a bad practice in Android / OOP in general?
是的。
Or is there a better way of doing what I'm trying to achieve?
可能。
什么很难说,因为还不完全清楚您要实现的目标以及此代码的结构。
但我建议您查看 this documentation on sharing data between fragments。考虑到这一点,考虑将此 OrderItem
对象保留在 一个 位置 - ViewModel
- 然后从每个 Fragment
或访问一个共享视图模型Activity
需要在订单项上使用 /。
这不是一个坏的做法,但是一个好的做法是使用共享视图模型,片段可以从中访问他们需要的数据
在我的应用程序中,我有一个 activity,它有一个使用 OrderItems
当用户点击一个项目时,我将对象从我的 RecyclerAdapter
传递到我的 MainActivity 以膨胀 BottomSheetDialog
public class ViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener {
. . .
int position;
ViewHolder(@NonNull View itemView) {
super(itemView);
ButterKnife.bind(this, itemView);
itemView.setOnClickListener(this);
}
@Override
public void onClick(View v) {
. . .
adapterCallback.onOrderItemClick(orderItem);
}
}
public interface OrdersAdapterCallback {
void onOrderItemClick(OrderItem orderItem);
}
在我的 MainActivity
中实现的接口回调方法中,我使用适配器中的对象(第一次传递对象)对 BottomSheetDialog
进行充气
MainActivity
@Override
public void onOrderItemClick(OrderItem orderItem) {
//Object passed from adapter
BottomSheetDialogFragment dialogFragment = BottomSheetOrderFragment.newInstance(orderItem);
dialogFragment.show(getSupportFragmentManager(), Constants.FRAGMENT_BOTTOMSHEET_ORDER);
}
当 BottomSheetDialog
膨胀时,有一个按钮可以关闭当前对话框,并膨胀 FragmentDialog
通过 OrderItem
(但在使用一些设置器之后)再次对象(第二次传递对象)。
Inside the BottomSheetDialog:
private BottomSheetOrderFragment(OrderItem orderItem){
this.orderItem = orderItem;
this.orderItem.setNewOrder("New order string here");
}
@OnClick(R.id.btn_edit_order)
void onEditOrderBtnClick(){
dismiss();
mainActivity.editOrder(this.orderItem);
}
所以目前我们已经将 OrderItem
对象传递给 MainActivity
中的两个不同片段。然后我必须将该对象传递给 MainViewModel
,然后传递给 MainRepo
,其中 RoomDatabase
class 将该对象插入本地数据库。
这最终让 OrderItem
通过它们的构造函数传递给 4 个不同的 classes,并在途中将一些 setter 应用于该对象。我的问题是,这在 Android / OOP 中通常是一种不好的做法吗?还是有更好的方法来实现我想要实现的目标?
My question is, is this a bad practice in Android / OOP in general?
是的。
Or is there a better way of doing what I'm trying to achieve?
可能。
什么很难说,因为还不完全清楚您要实现的目标以及此代码的结构。
但我建议您查看 this documentation on sharing data between fragments。考虑到这一点,考虑将此 OrderItem
对象保留在 一个 位置 - ViewModel
- 然后从每个 Fragment
或访问一个共享视图模型Activity
需要在订单项上使用 /。
这不是一个坏的做法,但是一个好的做法是使用共享视图模型,片段可以从中访问他们需要的数据