标签: android-mvvm

如何使用数据绑定使用mvvm模式

我正在开发一个登录表单的应用程序.我对模式有点困惑,因为我不明白我将如何打开新活动,因为我的登录成功.按照我的理解,当我点击提交时按钮viewmodel中的一个方法,它将通过身份验证获得调用,在我成功登录后,我不知道如何将其导航到活动文件,以便我可以调用新活动.

android android-mvvm

1
推荐指数
1
解决办法
103
查看次数

为什么 ViewModelProvider 在屏幕旋转时创建视图模型的新实例?

我试图实现分页,但每次我旋转视图模型的屏幕构造函数时都会被调用,从而触发 loadInitial 从我的 DataSource 类中的网络获取新数据。感谢帮助

// ViewModel
def lifecycle_version = "2.2.0"
implementation "androidx.lifecycle:lifecycle-viewmodel:$lifecycle_version"
// LiveData
implementation "androidx.lifecycle:lifecycle-livedata:$lifecycle_version"
Run Code Online (Sandbox Code Playgroud)

在我的活动 oncreate 中:

TopRatedResultViewModel viewModel =   ViewModelProvider.AndroidViewModelFactory.getInstance(getApplication()).create(TopRatedResultViewModel.class);
Run Code Online (Sandbox Code Playgroud)

查看型号:

public class TopRatedResultViewModel extends AndroidViewModel {
private Top_Rated_Results_Repository repository;

public TopRatedResultViewModel(@NonNull Application application) {
    super(application);
    Log.d("moviedatabaselog", "TopRatedResultViewModel ");
    repository = new Top_Rated_Results_Repository(application);

}

public LiveData<PagedList<Top_Rated_Result>> getTopRatedResultsPagedList() {
    return repository.getTopRatedResultsPagedList();
}
Run Code Online (Sandbox Code Playgroud)

我正在关注本教程Android 分页与改造, 但这里使用了不推荐使用的 ViewModelProviders.of 并且当我在屏幕旋转构造函数没有被调用后测试它时。

android android-mvvm android-livedata android-architecture-components

1
推荐指数
1
解决办法
684
查看次数

您是否忘记调用 Flow&lt;PagingData&lt;*&gt;&gt;.cachedIn(coroutineScope) ?

如何修复IllegalStateException:尝试从pageEventFlow收集两次,这是非法操作。

您是否忘记调用 Flow<PagingData<*>>.cachedIn(coroutineScope) ?

代码:

import androidx.lifecycle.SavedStateHandle
import androidx.lifecycle.ViewModel
import androidx.lifecycle.switchMap
import androidx.lifecycle.viewModelScope
import androidx.paging.cachedIn
import com.kharismarizqii.movieapp.data.MovieRepository
import dagger.hilt.android.lifecycle.HiltViewModel
import javax.inject.Inject

@HiltViewModel
class MovieViewModel @Inject constructor(
    private val repository: MovieRepository,
    state: SavedStateHandle) : ViewModel(){

    companion object{
        private const val CURRENT_QUERY = "current_query"
        private const val EMPTY_QUERY = ""
    }

    private val currentQuery = state.getLiveData(CURRENT_QUERY, EMPTY_QUERY)
    val movies = currentQuery.switchMap { query ->
        if (query.isNotEmpty()){
            repository.getSearchMovies(query)
        }else{
            repository.getNowPlayingMovies().cachedIn(viewModelScope)
        }
    }

    fun searchMovies(query: String){
        currentQuery.value = query
    }
}
Run Code Online (Sandbox Code Playgroud)

碰撞:

  java.lang.IllegalStateException: Attempt …
Run Code Online (Sandbox Code Playgroud)

android mvvm android-mvvm android-paging-library kotlin-coroutines

1
推荐指数
1
解决办法
4424
查看次数

ViewModel和AndroidViewModel有什么区别

对于任何有这个问题的人,

根据Android文档,

由于ViewModel的寿命超过了特定的活动和片段实例化,因此它绝不应引用View或任何可能包含对活动上下文的引用的类。如果ViewModel需要Application上下文(例如,查找系统服务),则它可以扩展AndroidViewModel类,并具有一个在构造函数中接收Application的构造函数(因为Application类扩展了Context)。

可以在这里找到文档:https : //developer.android.com/topic/libraries/architecture/viewmodel.html

编辑:重复说明:我的意思是您可以将类扩展到ViewModel以及AndroidViewModel。当您应该扩展它时,上面的解释仅用于此目的。上面的链接介绍了MVVM体系结构的ViewModel,而不是android.arch.lifecycle.ViewModel

android android-mvvm android-architecture-lifecycle

0
推荐指数
1
解决办法
3404
查看次数