Kotlin Firebase实时数据库MVVM中setMyBirthday函数的正确返回值
解决方案:用Unit替代Void
你的问题核心是Firebase Realtime Database的setValue().await()调用成功后不会返回有意义的数据,而Java的Void类型在Kotlin中不适用(它没有可用的实例),所以需要改用Kotlin原生的Unit类型。
步骤1:修改HomeRepository的返回类型
将setMyBirthday函数的返回类型明确为Unit(Kotlin中无返回值函数的默认返回类型,也可以省略不写,但明确写出更清晰):
suspend fun setMyBirthday(birthday: String): Unit { databaseReference .child("users") .child(myUserID) .child("birthday") .setValue(birthday) .await() }
步骤2:更新HomeViewModel的LiveData泛型
把myBirthday的泛型从Resource<Void>改为Resource<Unit>:
val myBirthday: MutableLiveData<Resource<Unit>> = MutableLiveData()
步骤3:调整ViewModel中Success事件的参数
在调用Resource.Success时传入Unit(Kotlin的无返回值标识),同时因为Repository返回的是Unit,不需要额外接收变量:
fun setMyBirthday(birthday: String) = viewModelScope.launch { try { myBirthday.postValue(Resource.Loading()) homeRepository.setMyBirthday(birthday) myBirthday.postValue(Resource.Success(Unit)) } catch (e: Exception) { myBirthday.postValue(Resource.Error(e.message!!)) } }
为什么不用Void?
Java的Void类型设计用于表示"无返回值",但它本身是一个没有实例的类——你无法创建Void的对象,只能传入null。而Kotlin的Unit是一个有明确实例的单例对象,完美适配这种"只需要通知操作成功,不需要返回数据"的场景,也符合Kotlin的类型系统规范。
内容的提问来源于stack exchange,提问作者Kleini
相关产品推荐
相关产品推荐

