Tag: android viewmodel

MutableLiveData:在Retrofit / Moshi中分配给ArrayList的问题

我正在用一个Retrofit HTTP调用来调试一个问题。 正在进行的调用是成功的,并且响应似乎与我的POJO(在这种情况下为Kotlin数据类)格式相同。 然而,在将我的POJO列表分配给Response>时似乎有一些脱节。 没有错误,而且我已经证实,答复实际上并不是错误的。 我在这里错过了什么? 你会如何去find我的MutableLiveData和我的响应之间的断开? 发生断开连接的ViewModel。 调用enqueueProjectAPICall()之后,尽管响应是项目列表,但_projects仍然为空: class ProjectBrowserViewModel(): ViewModel(){ private var projectCall: Call private val API_KEY = “whatever” //Mutable private data private val _projects = MutableLiveData<List>() private val _selectedField = MutableLiveData() //Exposed Data val projects: LiveData<List> get() = _projects val selectedField: LiveData get()=_selectedField init { projectCall = BehanceAPI.behanceService.projects(API_KEY) } fun loadProjectsFromField(fieldName: String){ […]

用于ViewModels的自定义半广义工厂

我想创建一个广义的ViewModelProvider.Factory来实例化我的ViewModels class BundledAppFactory(private var bundle: AppParameterBundle) : ViewModelProvider.NewInstanceFactory() { override fun create(modelClass: Class): T { Log.d(“Factory”, “Creating ${modelClass.canonicalName}”) Log.d(“Factory”, “${modelClass.canonicalName} has ${modelClass.constructors.size} constructors and ${modelClass.declaredConstructors.size} declaredConstructors”) modelClass.constructors.forEach { Log.d(“Factory”, “Constructor: $it”) } return when { AppViewModel::class.java.isAssignableFrom(modelClass) -> modelClass.getDeclaredConstructor(AppParameterBundle::class.java).newInstance(bundle) AppTeamUserViewModel::class.java.isAssignableFrom(modelClass) -> modelClass.getDeclaredConstructor(AppTeamUserParameterBundle::class.java).newInstance(bundle) AppTeamUserHuntIdViewModel::class.java.isAssignableFrom(modelClass) -> modelClass.getDeclaredConstructor(AppTeamUserHuntIdParameterBundle::class.java).newInstance(bundle) AppStringViewModel::class.java.isAssignableFrom(modelClass) -> modelClass.getDeclaredConstructor(AppStringParameterBundle::class.java).newInstance(bundle) else -> super.create(modelClass) } } } 这些是我的包: open […]

Kotlin:只读不可变types对可变types的内部variables的访问

在Android中学习ViewModel的时候,出现了一个像Kotlin想要解决的问题。 在下面的代码中,我们可以看到MutableLiveData值正在用来编辑值和指标。 但是,我们不希望这些可变值暴露给其他任何人,特别是Android生命周期的成员。 我们希望Android生命周期成员有权读取值但不设置它们。 因此,下面显示的3个暴露函数是LiveData 不可变类型。 是否有一个更简单或更简洁的方法来公开只能在内部进行编辑的只读值? 这看起来像Kotlin是为了避免:模板的详细程度。 class HomeListViewModel: ViewModel(){ //Private mutable data private val repositories = MutableLiveData<List>() private val repoLoadError = MutableLiveData() private val loading = MutableLiveData() //Exposed uneditable LIveData fun getRepositories():LiveData<List> = repositories fun getLoadError(): LiveData = repoLoadError fun getLoadingStatuses(): LiveData = loading init{…//Do some stuff to MutableLiveData } } 非Android情况可能类似: class […]

如何在android中从viewmodel调用baseactivity函数

您好我有LoginActivity和LoginViewModel和一些更多的类。 我有showLoading并hideLoading在BaseActivity所以它可以从每个活动访问。 我能够从LoginViewModel像mNavigator?.startForgotPasswordActivity()调用LoginActivity方法mNavigator?.startForgotPasswordActivity() 我想从LoginViewModel调用它,然后使用MVVM做到这一点? 或者我正在用错误的方法去做。 请建议什么是正确的方法来做到这一点? BaseActivity.kt abstract class BaseActivity : AppCompatActivity(), AnkoLogger { private val progressBar: ProgressBar? = null override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) } protected fun getToolbar(): Toolbar { val toolbar: Toolbar = findViewById(R.id.toolbar) setSupportActionBar(toolbar) return toolbar } protected fun performDependencyInjection() { AndroidInjection.inject(this); } @TargetApi(Build.VERSION_CODES.M) fun requestPermissionsSafely(permissions: Array<String>, requestCode: Int) { if […]

如何从mvvm模式登录成功viewmodel启动活动

嗨,我有一个活动LoginActivity.kt和LoginViewModel 。 我在LoginViewModel的login方法中调用登录API。 在成功之后,我想开始家庭活动。 在MVVM方法中,正确的方法是什么? LoginViewModel.kt class LoginViewModel : BaseViewModel<LoginNavigator>(), AnkoLogger { val emailField = ObservableField<String>() private val email: String get() = emailField.get() val passwordField = ObservableField<String>() private val password: String get() = passwordField.get() val progressVisibility: ObservableInt = ObservableInt(View.GONE) @Suppress("PARAMETER_NAME_CHANGED_ON_OVERRIDE") fun login(view: View) { // here I am calling API and on success } /** […]