首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何在没有ViewModelProviders类的情况下获得ViewModel?

如何在没有ViewModelProviders类的情况下获得ViewModel?
EN

Stack Overflow用户
提问于 2018-08-16 06:09:07
回答 2查看 6.6K关注 0票数 5

关于过去的问题How to get a ViewModel?,以及我找到的例子,它不能解决我的问题。我不允许在这里发表评论,所以我必须再问一次。我没有像在我找到的所有示例和文档中那样使用"of“方法的ViewModelProviders类,比如

代码语言:javascript
复制
model = ViewModelProviders.of(this).get(Something.class);

在Android Studio中,我没有找到要添加为依赖项的"android.arch.lifecycle:extensions“。当我搜索的时候,它显示“没有要显示的东西”。我在API 27。因此,为了尝试使用非弃用元素,我在片段中包含以下内容:

代码语言:javascript
复制
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);
...
}

我该怎么办?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-08-16 06:20:50

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

代码语言:javascript
复制
dependencies {
    implementation 'android.arch.lifecycle:extensions:1.1.1'

    // ... 
}

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

票数 8
EN

Stack Overflow用户

发布于 2018-08-16 07:52:33

如果你对安卓和Java有更好的了解,可以尝试学习一些MVVM架构。将此代码放入某个baseFragment方法中,然后执行:

代码语言:javascript
复制
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

代码语言:javascript
复制
// 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 place中观察一些东西,比如网络操作,或者需要更长时间的东西。

代码语言:javascript
复制
// 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上观察到我们可爱的变量

代码语言:javascript
复制
// 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

代码语言:javascript
复制
//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/,因为它过去很难理解。试试中号的。

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51867122

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档