我正在开发一个登录表单的应用程序.我对模式有点困惑,因为我不明白我将如何打开新活动,因为我的登录成功.按照我的理解,当我点击提交时按钮viewmodel中的一个方法,它将通过身份验证获得调用,在我成功登录后,我不知道如何将其导航到活动文件,以便我可以调用新活动.
我试图实现分页,但每次我旋转视图模型的屏幕构造函数时都会被调用,从而触发 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
如何修复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
对于任何有这个问题的人,
根据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 ×4
android-mvvm ×4
android-architecture-components ×1
android-architecture-lifecycle ×1
mvvm ×1