如何获得一个ViewModel?

时间:2018-07-10 12:07:17

标签: android android-fragments viewmodel deprecated

我只想在我的Fragment(扩展Fragment)中引用我的ViewModel.class(从AndroidViewModel扩展)。到处都是这样描述的:

UserModel userModel = ViewModelProviders.of(getActivity()).get(UserModel.class);

description on Android Developer

...,但是很久以前不推荐使用ViewModelProviders。

*该类在API级别1.1.0中已弃用。 *

我无法通过以下方式导入该类: android.arch.lifecycle。[ViewModelProviders]

它仅提供ViewModelProvider和其他内容。


如何获取UserModel.class的实例?

6 个答案:

答案 0 :(得分:2)

  

但是很久以前不推荐使用ViewModelProviders

ViewModelProviders不被弃用。因此,请使用ViewModelProviders

ViewModelProviders.of(yourFragment).get(UserModel.class)

已弃用ViewModelProviders,例如其构造函数,但总体上不是。

答案 1 :(得分:1)

这里是写ViewModel

的方法
public class MyViewModel extends ViewModel {
private MutableLiveData<List<User>> users;
public LiveData<List<User>> getUsers() {
    if (users == null) {
        users = new MutableLiveData<List<User>>();
        loadUsers();
    }
    return users;
}

private void loadUsers() {
    // Do an asynchronous operation to fetch users.
}
}

然后将其用于您的功能性中

public class MyActivity extends AppCompatActivity {
public void onCreate(Bundle savedInstanceState) {
    // Create a ViewModel the first time the system calls an activity's onCreate() method.
    // Re-created activities receive the same MyViewModel instance created by the first activity.

    MyViewModel model = ViewModelProviders.of(this).get(MyViewModel.class);
    model.getUsers().observe(this, users -> {
        // update UI
    });
}
}

答案 2 :(得分:0)

使用Kotlin和最新的Android体系结构组件,您应该像这样使用by viewModels() Kotlin属性委托:

class YourFragment : Fragment() {
   private val viewModel by viewModels<YourViewModel>()
}

更多信息here

答案 3 :(得分:0)

不推荐使用类ViewModelProviders! 使用已理解的ViewModelProvider

MyViewModel viewModel = new ViewModelProvider(this).get(MyViewModel.class);

快乐编码:)

答案 4 :(得分:0)

深入研究后,我通过向“活动”中添加以下方法解决了类似的问题:

protected final <T extends ViewModel> ViewModel obtainViewModel(@NonNull AppCompatActivity activity, @NonNull Class<T> modelClass) {
    ViewModelProvider.AndroidViewModelFactory factory = ViewModelProvider.AndroidViewModelFactory.getInstance(activity.getApplication());
    return new ViewModelProvider(activity, factory).get(modelClass);
}

然后我在片段中做到了:

protected final <T extends ViewModel> ViewModel obtainFragmentViewModel(@NonNull FragmentActivity fragment, @NonNull Class<T> modelClass) {
    ViewModelProvider.AndroidViewModelFactory factory = ViewModelProvider.AndroidViewModelFactory.getInstance(fragment.getApplication());
    return new ViewModelProvider(fragment, factory).get(modelClass);
}

我已经有了一些用于菜单目的的抽象超类,因此我将方法隐藏在那里,因此不必在每次活动中都重复它。这就是为什么他们受到保护。我相信,如果您将它们放在需要它们的每个活动或片段中,它们可能是私有的。

为了尽可能清晰,我将在活动中调用方法在onCreate()中分配视图模型,看起来像这样

private MyViewModel myViewModel;

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    myViewModel = (MyViewModel) obtainViewModel(this, MyViewModel.class);
}

或分段

private MyViewModel myViewModel;

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    if (getActivity() != null) {
        myViewModel = (MyViewModel) obtainFragmentViewModel(getActivity(), MyViewModel.class);
    }
}

到目前为止,它似乎工作正常。如果有人有更好的方法,请告诉我们!

答案 5 :(得分:0)

BeirDav's answer 的 Kotlin 版本是

val vm = ViewModelProvider(requireActivity()).get(MyViewModel::class.java)