Par*_*dam 41 android mvvm android-architecture-components
我正在尝试使用Android架构组件编写示例应用程序,但即使在尝试了几天之后我也无法使用它.它给了我以上例外.
生命周期所有者: -
public class MainActivity extends LifecycleActivity {
public void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
TextView textView = findViewById(R.id.tv_user);
PostViewModel viewModel = ViewModelProviders.of(this).get(PostViewModel.class);
viewModel.loadPosts();
viewModel.getPost().observe(this, new Observer<Post>() {
@Override
public void onChanged(@Nullable Post post) {
if(post != null) {
textView.setText(post.toString());
}
}
});
}
}
Run Code Online (Sandbox Code Playgroud)
视图模型: -
public class PostViewModel extends ViewModel {
private MediatorLiveData<Post> post;
private PostRepository postRepo;
PostViewModel() {
post = new MediatorLiveData<>();
postRepo = new PostRepository();
}
public LiveData<Post> loadPosts() {
post.addSource(postRepo.getPost(),
post -> this.post.setValue(post)
);
return post;
}
@NonNull
public LiveData<Post> getPost() {
return post;
}
}
Run Code Online (Sandbox Code Playgroud)
Com*_*are 80
制作你的构造函数public.
You*_* Qi 73
如果您正在使用Hilt,请确保您的活动/片段有@AndroidEntryPoint注释
viv*_*vek 13
确保你的ViewModel构造函数只有一个参数,即Application.
例:
public YourViewModel(Application application) {
super(application);
...
Run Code Online (Sandbox Code Playgroud)
thi*_*tch 13
我在 google 的roomdb CodeLab之后遇到了这个问题。解决方案是更改以下内容。
将以下构建依赖项添加到 Gradle 文件(截至 2/22/2020)
implementation 'androidx.fragment:fragment:1.2.2'
implementation 'androidx.lifecycle:lifecycle-process:2.2.0'
implementation 'androidx.lifecycle:lifecycle-service:2.2.0'
implementation 'androidx.lifecycle:lifecycle-viewmodel-savedstate:2.2.0'
annotationProcessor 'androidx.lifecycle:lifecycle-compiler:2.2.0'
Run Code Online (Sandbox Code Playgroud)
片段内的导入
import androidx.lifecycle.ViewModelProvider;
import androidx.fragment.app.Fragment;
import androidx.lifecycle.Observer;
Run Code Online (Sandbox Code Playgroud)
创建视图模型。添加以下方法之一。
注意:我见过很多方法。我相信正确的方法是使用getDefaultViewModelProviderFactory(). 不过我一直在用requireActivity()。
new ViewModelProvider(requireActivity(),getDefaultViewModelProviderFactory()).get(YourViewModel.class);
Run Code Online (Sandbox Code Playgroud)
|
new ViewModelProvider(requireActivity()).get(YourViewModel.class);
Run Code Online (Sandbox Code Playgroud)
已弃用
implementation 'androidx.lifecycle:lifecycle-extensions:2.2.0-rc01'
annotationProcessor 'androidx.lifecycle:lifecycle-compiler:2.2.0-rc01'
Run Code Online (Sandbox Code Playgroud)
Max*_*Max 10
如果您使用的Kotlin一定要更换任何annotationProcessor在build.gradle用kapt。
喜欢:
annotationProcessor "android.arch.persistence.room:compiler:$rootProject.roomVersion"
会变成
kapt "android.arch.persistence.room:compiler:$rootProject.roomVersion"
并添加
apply plugin: 'kotlin-kapt'在buidl.gradle文件顶部。
抛出异常的理由很少。我提到了其中一些..
确保您的视图模型类是公开的
确保您的视图模型类构造函数是公共的
如果您使用房间和其他已添加的库,请确保您已在生命周期的 gradle 文件中添加了依赖项 ..
如果您在视图模型类构造函数中创建对象任何其他依赖类。其他类可以抛出错误来创建viewModel的实例
这对我来说并不是很明显,但是当遇到这个错误时,我通过创建一个公共构造函数来解决它。我的构造函数源自 Android Developer 示例,并包含 Repository 作为参数。创建一个没有参数的空构造函数并将其公开解决了这个问题。
即,在你的情况下
public PostViewModel() {}
从 ViewModel 类扩展AndroidViewModel 。
public class YourViewModel extends AndroidViewModel {
public YourViewModel(Application application) {
super(application);
//Todo: ...
}
}
Run Code Online (Sandbox Code Playgroud)
小智 5
如果您在活动中使用了 viewmodel,请检查您的活动是否扩展了“DaggerAppCompatActivity”
例如
public class UserComments extends AppCompatActivity
Run Code Online (Sandbox Code Playgroud)
将此更改为
public class UserComments extends DaggerAppCompatActivity
Run Code Online (Sandbox Code Playgroud)