【问题标题】:ViewModel cannot be instantiated in an ActivityViewModel 不能在 Activity 中实例化
【发布时间】:2023-04-03 04:16:02
【问题描述】:

我正在尝试实例化一个 ViewModel 以在我的所有 Activity 中使用。

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 开发人员在Implementing ViewModel 上的示例here;扩展 ViewModel 的类应该可以在 Activity 上实例化,对吗?

如果我做错了,我应该如何为我的 Activity 实例化一个 ViewModel 对象?由于ViewModelProviders.of() 仅适用于 Fragment,我是否必须使用 Fragment 创建 n 数量的 Activity?

【问题讨论】:

  • 尝试使用 AppCompatActivity

标签: android android-layout android-fragments android-viewmodel


【解决方案1】:

您需要使用support library 活动。

AppCompatActivityFragmentActivity

【讨论】:

    【解决方案2】:

    @elmorabea 的回答是正确的,但这里需要注意的重要一点是,如果您启用了 AndroidX 并且仍然遇到表明您需要传入片段而不是活动的问题,请确保您的班级扩展了正确 AppCompatActivity。 IE,请确保您使用的是:

    import androidx.appcompat.app.AppCompatActivity;
    

    而不是

    import android.support.v7.app.AppCompatActivity;
    

    因为一个来自 AndroidX 而另一个不是。有关 AndroidX 迁移的更多信息,请参阅this 链接。

    【讨论】:

      【解决方案3】:

      您正在扩展ActivityViewModelProvidersFragmentActivity 以及从它继承的东西一起使用,例如 AppCompatActivity。它也适用于Fragment (android.support.v4.app.Fragment) 的后向端口。原生 ActivityFragment 类没有官方支持。

      【讨论】:

      • 我从 AppCompatActivity 扩展。但它仍然显示“无法解析 ViewModelProvider.of()”的错误
      • @MudasirRao:您在 ViewModelProviders 中缺少一个“s”。如果它仍然不起作用,请确保您的 Gradle 文件包含依赖项,例如编译'android.arch.lifecycle:extensions:1.1.1'
      • 您可能导入了androidx.lifecycle.ViewModelProviders 而不是android.arch.lifecycle.ViewModelProviders
      【解决方案4】:

      如果您不想更改活动以从另一个活动类扩展的另一种解决方案(如果您的 BaseActivity 已被使用并严重依赖 Activity 并且如果更改父活动类可能会导致错误):

      @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 依赖。

      【讨论】:

        【解决方案5】:

        我正在使用这个:

         LoginViewModel viewModel = ViewModelProviders.of(this).get(LoginViewModel.class);
        

        参考:https://developer.android.com/topic/libraries/architecture/viewmodel#java

        【讨论】:

          【解决方案6】:

          对我来说,我正在扩展 AppCompatActivity,但它仍然无法正常工作。但是implementation 'androidx.lifecycle:lifecycle-extensions:2.2.0' 不见了,添加它工作正常。

          【讨论】:

            猜你喜欢
            • 2021-01-06
            • 2022-10-24
            • 1970-01-01
            • 2019-06-16
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2020-04-10
            • 1970-01-01
            相关资源
            最近更新 更多