无法在 Activity 中实例化 ViewModel
ViewModel cannot be instantiated in an Activity
我正在尝试实例化一个 ViewModel 以在我的所有 Activity(s) 中使用。
public class LaunchActivity extends Activity {
private Controller control;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_launch);
control = ViewModelProviders.of(this).get(Controller.class);
}
}
但我在 control = ViewModelProviders.of(this) <--
处收到一个错误,指出它无法解析 of(this)
,但基于 Android 开发人员关于实施 ViewModel 的示例 here;扩展 ViewModel 的 class 应该能够在 Activity 上实例化,对吗?
如果我做错了,我应该如何为我的 Activity(s) 实例化一个 ViewModel 对象?我是否必须创建 n
数量的 Activity(s) 与 Fragment(s) 因为 ViewModelProviders.of()
仅适用于 Fragment?
您正在扩展 Activity
。 ViewModelProviders
与 FragmentActivity
以及从其继承的东西一起使用,例如 AppCompatActivity
。它还适用于 Fragment
(android.support.v4.app.Fragment
) 的反向移植。没有官方支持原生 Activity
或 Fragment
class.
您需要使用 support library
activity.
AppCompatActivity
或 FragmentActivity
另一个解决方案,如果你不想改变你的 activity 以从另一个 Activity class 扩展(如果你的 BaseActivity 已经被使用并且依赖严重依赖 Activity
,如果更改父 activity class) 可能会导致错误:
@Nullable
private ViewModelStore viewModelStore = null;
@Override
public Object onRetainNonConfigurationInstance() {
return viewModelStore;
}
@NonNull
private ViewModelStore getViewModelStore() {
Object nonConfigurationInstance = getLastNonConfigurationInstance();
if (nonConfigurationInstance instanceof ViewModelStore) {
viewModelStore = (ViewModelStore) nonConfigurationInstance;
}
if (viewModelStore == null) {
viewModelStore = new ViewModelStore();
}
return viewModelStore;
}
public ViewModelProvider getViewModelProvider() {
ViewModelProvider.Factory factory =
ViewModelProvider.AndroidViewModelFactory.getInstance(getApplication());
return new ViewModelProvider(getViewModelStore(), factory);
}
这个逻辑类似于FragmentActivity
中的逻辑
那么,我们只需要调用getViewModelProvider()
,而不是调用ViewModelProviders.of(this)
。为了获得 Controller
:
control = getViewModelProvider().get(Controller.class)
通过这样做,我们不需要添加 android.arch.lifecycle:extensions
依赖项。
我正在使用这个:
LoginViewModel viewModel = ViewModelProviders.of(this).get(LoginViewModel.class);
参考:https://developer.android.com/topic/libraries/architecture/viewmodel#java
@elmorabea 的回答是正确的,但这里需要注意的一件重要事情是,如果您启用了 AndroidX 并且仍然遇到表明您需要传入片段而不是 activity,确保您的 class 扩展了 正确的 AppCompatActivity。 IE,确保你使用的是:
import androidx.appcompat.app.AppCompatActivity;
而不是
import android.support.v7.app.AppCompatActivity;
因为一个来自 AndroidX 而另一个不是。有关 AndroidX 迁移的详细信息,请参阅 this link。
对我来说,我正在扩展 AppCompatActivity
,但它仍然无法正常工作。但是 implementation 'androidx.lifecycle:lifecycle-extensions:2.2.0'
不见了,添加它工作正常。
我正在尝试实例化一个 ViewModel 以在我的所有 Activity(s) 中使用。
public class LaunchActivity extends Activity {
private Controller control;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_launch);
control = ViewModelProviders.of(this).get(Controller.class);
}
}
但我在 control = ViewModelProviders.of(this) <--
处收到一个错误,指出它无法解析 of(this)
,但基于 Android 开发人员关于实施 ViewModel 的示例 here;扩展 ViewModel 的 class 应该能够在 Activity 上实例化,对吗?
如果我做错了,我应该如何为我的 Activity(s) 实例化一个 ViewModel 对象?我是否必须创建 n
数量的 Activity(s) 与 Fragment(s) 因为 ViewModelProviders.of()
仅适用于 Fragment?
您正在扩展 Activity
。 ViewModelProviders
与 FragmentActivity
以及从其继承的东西一起使用,例如 AppCompatActivity
。它还适用于 Fragment
(android.support.v4.app.Fragment
) 的反向移植。没有官方支持原生 Activity
或 Fragment
class.
您需要使用 support library
activity.
AppCompatActivity
或 FragmentActivity
另一个解决方案,如果你不想改变你的 activity 以从另一个 Activity class 扩展(如果你的 BaseActivity 已经被使用并且依赖严重依赖 Activity
,如果更改父 activity class) 可能会导致错误:
@Nullable
private ViewModelStore viewModelStore = null;
@Override
public Object onRetainNonConfigurationInstance() {
return viewModelStore;
}
@NonNull
private ViewModelStore getViewModelStore() {
Object nonConfigurationInstance = getLastNonConfigurationInstance();
if (nonConfigurationInstance instanceof ViewModelStore) {
viewModelStore = (ViewModelStore) nonConfigurationInstance;
}
if (viewModelStore == null) {
viewModelStore = new ViewModelStore();
}
return viewModelStore;
}
public ViewModelProvider getViewModelProvider() {
ViewModelProvider.Factory factory =
ViewModelProvider.AndroidViewModelFactory.getInstance(getApplication());
return new ViewModelProvider(getViewModelStore(), factory);
}
这个逻辑类似于FragmentActivity
那么,我们只需要调用getViewModelProvider()
,而不是调用ViewModelProviders.of(this)
。为了获得 Controller
:
control = getViewModelProvider().get(Controller.class)
通过这样做,我们不需要添加 android.arch.lifecycle:extensions
依赖项。
我正在使用这个:
LoginViewModel viewModel = ViewModelProviders.of(this).get(LoginViewModel.class);
参考:https://developer.android.com/topic/libraries/architecture/viewmodel#java
@elmorabea 的回答是正确的,但这里需要注意的一件重要事情是,如果您启用了 AndroidX 并且仍然遇到表明您需要传入片段而不是 activity,确保您的 class 扩展了 正确的 AppCompatActivity。 IE,确保你使用的是:
import androidx.appcompat.app.AppCompatActivity;
而不是
import android.support.v7.app.AppCompatActivity;
因为一个来自 AndroidX 而另一个不是。有关 AndroidX 迁移的详细信息,请参阅 this link。
对我来说,我正在扩展 AppCompatActivity
,但它仍然无法正常工作。但是 implementation 'androidx.lifecycle:lifecycle-extensions:2.2.0'
不见了,添加它工作正常。