【问题标题】:How do I get a ViewModel without ViewModelProviders class?如何获得没有 ViewModelProviders 类的 ViewModel?
【发布时间】:2019-01-22 19:52:10
【问题描述】:

关于过去的问题How to get a ViewModel?,以及我找到的示例,它并不能解决我的问题。我没有在那里发表评论的权限,所以我不得不再次询问。我没有 ViewModelProviders 类,我想在我找到的所有示例和文档中使用“of”方法,例如

model = ViewModelProviders.of(this).get(Something.class);

在 Android Studio 中,我没有找到“android.arch.lifecycle:extensions”作为依赖项添加。当我搜索时,它说“没什么可显示的”。我在 API 27。 因此,尝试使用未弃用的元素,我在 Fragment 中有这个:

public class EventDetailsFragment extends Fragment
{
EventViewModel viewModel;

@Override
public void onActivityCreated (Bundle savedInstanceState)
{
    super.onActivityCreated(savedInstanceState);
    ViewModelProvider.Factory factory = ViewModelProvider.AndroidViewModelFactory.getInstance(getActivity().getApplication());
    // HERE IS THE ISSUE: Seems not good practice to have to create a new ViewModelProvider every time this Fragment is created. 
    // Perhaps I should just create a singleton ViewModelProvider in the Activity or Application, 
    // so here could call getActivity().getViewModelProvider(this, factory).
    ViewModelProvider viewModelProvider = new ViewModelProvider(this, factory);
    viewModel = viewModelProvider.get(EventViewModel.class);
...
}

我该怎么办?

【问题讨论】:

  • 您发布的代码完全是 ViewModelProviders.of() 所做的代码 - 它会在每次调用时创建一个新的 ViewModelProvider 类。
  • 有趣。似乎效率低下。你觉得我使用单例的想法如何?
  • ViewModelProvider 只是ViewModelStoreFactory 的一个薄包装器,因此使其成为您的Activity/Fragment 的成员变量(它不能是单例,因为它引用了@ 987654329@ 即 Activity/Fragment)当然很方便,但它不会改变您的应用程序的工作/执行方式。

标签: android android-viewmodel


【解决方案1】:

打开app/build.gradle,找到dependencies块并将生命周期依赖手动添加到列表中:

dependencies {
    implementation 'android.arch.lifecycle:extensions:1.1.1'

    // ... 
}

同步项目,之后您应该能够获得 ViewModel 的实例。

【讨论】:

  • 谢谢。我喜欢这样的简单问题的简单解决方案。
【解决方案2】:

如果您对 Android 和 Java 有更好的了解,请尝试学习一些 MVVM 架构。将此代码放入某个baseFragment 方法中,然后制作:

abstract class BaseFragment extends Fragment() {
    //kotlin
    fun <T : ViewModel?> getViewModel(activity: FragmentActivity, modelClass: Class<T>): T {
        return ViewModelProviders.of(this, ViewModelFactory(activity)).get(modelClass)
    }

    //bytecode to java is this :/
    public final ViewModel obtainViewModel(@NotNull FragmentActivity activity, @NotNull Class modelClass) {
          return ViewModelProviders.of((Fragment)this, (Factory)(new 
          ViewModelFactory((Activity)activity))).get(modelClass);
       }
}

也不要将此代码放入onViewCreated而不是onActivityCreated

// kotlin
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
    super.onViewCreated(view, savedInstanceState)
    viewModel = obtainViewModel(requireActivity(), KebabFragmentViewModel::class.java)
}

// java bytecode
public void onViewCreated(@NotNull View view, @Nullable Bundle savedInstanceState) {
    super.onViewCreated(view, savedInstanceState);
    this.viewModel = (RollerFragmentViewModel)this.obtainViewModel(getFragmentActivity(), RollerFragmentViewModel.class); 
}

现在你需要观察者来观察 onViewCreated mby 中 viewModel 中的某些东西,以进行一些可能的网络操作或可能需要更长时间的东西

// kotlin
viewModel.list.observe(this, Observer { list ->
    list?.let {
        viewModel.myKebabAdapter.updateList(list)
    }
})

//java
this.viewModel.getErrorMessage().observe((LifecycleOwner)this, (Observer)(new Observer() {
    ...
    public final void onChanged(@Nullable List list) {
        this.viewModel.myKebabAdapter.updateKebabList(list)
    }
}

在 viewModel 中你得到了我们可爱的变量来观察activity/fragment

// kotlin
var list: MutableLiveData<MutableList<User>> = MutableLiveData()

// java variable and getter
@NotNull
private MutableLiveData userList;

@NotNull
public final MutableLiveData getUserList() {
   return this.userList;
}

现在你需要在 dependencies{} 块中依赖 app/build.gradle

//lifecycle
implementation "android.arch.lifecycle:extensions:1.1.1"
implementation "android.arch.lifecycle:viewmodel:1.1.1"

// RxJava
implementation "io.reactivex.rxjava2:rxkotlin:2.2.0"
implementation "io.reactivex.rxjava2:rxandroid:2.0.0"
implementation "io.reactivex.rxjava2:rxjava:2.1.10"

查找一些如何正确执行此操作的博客教程。我个人不喜欢 https://developer.android.com/ 它曾经很难理解。试试中等。

GL。 Java 代码大部分是反编译的,所以希望它能正常工作。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-11-24
    • 2019-06-14
    • 2013-08-30
    • 2021-12-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多