片段的视图模型

Posted

技术标签:

【中文标题】片段的视图模型【英文标题】:ViewModel for fragment 【发布时间】:2021-02-11 16:17:55 【问题描述】:

我在原生 android 开发中应用 MVVM 模式。我有一个 LoginActivity,它将承载两个不同的片段,即 LoginFragment 和 RegisterFragment。我不确定在这种情况下该怎么做。 LoginActivity 的视图模型或两个片段的两个不同的视图模型。如果我为活动创建一个视图模型,登录和注册视图绑定和逻辑将相互混淆。但是在许多教程中,开发人员说我们应该为每个活动创建一个视图模型并从片段访问这些视图模型。我应该如何处理这里的事情?

如有必要,我的登录片段

public class LoginFragment extends Fragment 
private LoginViewModel loginViewModel;

public LoginFragment() 


@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
                         Bundle savedInstanceState) 
    FragmentLoginBinding fragmentLoginBinding = DataBindingUtil.setContentView(getActivity(), R.layout.fragment_login);
    loginViewModel = ViewModelProviders.of(this, new LoginViewModelFactory(getActivity().getApplication(),
            LoginRepository.getInstance())).get(LoginViewModel.class);
    fragmentLoginBinding.setViewModel(loginViewModel);
    fragmentLoginBinding.executePendingBindings();
    return inflater.inflate(R.layout.fragment_login, container, false);

 

和登录活动

public class LoginActivity extends AppCompatActivity 
private LoginViewModel loginViewModel;

@Override
protected void onCreate(Bundle savedInstanceState) 
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_login);

    FragmentUtil.replaceFragment(getSupportFragmentManager(), R.id.entry_frame, new LoginFragment(), "login");
 

【问题讨论】:

我更喜欢创建两个视图模型,因为屏幕不同,具有不同的功能......如果您完成了一些过程并且需要与活动通信,您可以共享此视图模型并使用 livedata通知一个动作:关闭、下一步、上一步​​等 【参考方案1】:

访问 Activity ViewModel 的一种方法是在 Fragment 中调用 getActivity,然后将其转换为您拥有的 Class 并访问 PUBLIC viewModel 属性。

我不知道您的确切用例,但我可能会使用多个 Fragment 并且在具有一些共享逻辑的那些之上有一个存储库。

您可以像这样删除多个片段的一些样板:

https://itnext.io/get-rid-of-fragment-activity-boilerplate-code-using-kotlin-1b103763baf8?sk=a4b037902f0fe4bfdec10cc9cc814426

【讨论】:

【参考方案2】:

在我看来,你应该创建两个不同的 ViewModel。因为,ViewModel 旨在存储和管理 Activity 或 Fragment 生命周期中的 UI 相关数据。这样做可以帮助您独立且易于管理逻辑。

如果要在fragment和activity或者fragment和fragment之间共享数据,可以看:

导航图:https://developer.android.com/guide/navigation/navigation-programmatic#share_ui-related_data_between_destinations_with_viewmodel 通常:https://developer.android.com/guide/navigation/navigation-pass-data

【讨论】:

以上是关于片段的视图模型的主要内容,如果未能解决你的问题,请参考以下文章

LiveData 没有观察具有共享视图模型的子视图页面片段

未解决的对视图模型的引用

如何在作为选项卡的 2 个片段之间共享视图模型

如何防止在背面片段导航上再次设置视图模型

我如何使用视图模型从另一个片段访问函数

使用 koin 2.2.3 和 jetpack 导航在 2 个片段之间限定视图模型