Zor*_*gan 8 android mvvm kotlin firebase firebase-cloud-messaging
我正在使用 Firebase Cloud Messaging 在我的应用中接收数据:
class CustomFirebaseMessagingService : FirebaseMessagingService() {
override fun onMessageReceived(msg: RemoteMessage?) {
val data = msg?.data ?: return
val name = data["name"] as String
val age = data["age"]?.toIntOrNull() ?: return
val bio = data["bio"] as String
val img1 = data["img1"] as String
val match = Profile(name, age, bio, img1, null, null)
Log.d(TAG, "onMessageReceived(): $name is $age")
val fcmViewModel = ViewModelProviders.of(this).get(FcmViewModel::class.java) // .of() only takes a fragment/activity
FcmViewModel().match.postValue(match)
Log.d(TAG, "Value: " + FcmViewModel().match.value.toString()) // null
super.onMessageReceived(msg)
}
Run Code Online (Sandbox Code Playgroud)
当我收到 FCM 时,我想将它传递给我的 Fragment。我尝试使用 LiveData + ViewModel,但不幸的postValue()是,实际上并没有从服务更改 ViewModel 中的数据,因为我无法从服务实例化对 ViewModel 的引用。
class FcmViewModel : ViewModel() {
val match: MutableLiveData<Profile> by lazy {
MutableLiveData<Profile>()
}
}
class MapFragment : Fragment() {
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
fcmViewModel.match.observe(this, Observer<Profile> { profile ->
log("${profile.name} is ${profile.age}") // doesn't print
})
}
}
Run Code Online (Sandbox Code Playgroud)
有没有更好的办法从数据传递FirebaseMessagingService()到我的片段或发布方式数据FcmViewModel()中的FirebaseMessagingService()?
Har*_*edi 12
随着LocalBroadcastManager标示为淘汰,它好像有现在这样的没有标准的方式。
不过LiveData与ViewModels. 您仍然可以使用LiveData. 我会推荐他评论过的@tyczj 的解决方案。或者您可以执行以下操作。
创建一个单例类,它将用作您的小型事件总线框架。这个单例类可以包含LiveData您需要的列表,Fragment并且Service可以访问 LiveData 的实例。Service 和 Fragment 可以充当生命周期所有者,因此您不会遇到任何问题。
下面是一个sudo代码
object Events {
val serviceEvent: MutableLiveData<String> by lazy {
MutableLiveData<String>()
}
}
class CustomFirebaseMessagingService : FirebaseMessagingService() {
override fun onMessageReceived(msg: RemoteMessage?) {
Events.serviceEvent.postValue(profileObj)
super.onMessageReceived(msg)
}
}
class MapFragment: Fragment {
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
Events.serviceEvent.observe(this, Observer<Profile> { profile ->
log("${profile.name} is ${profile.age}")
})
}
Run Code Online (Sandbox Code Playgroud)
您还可以通过覆盖和函数创建自己的子类LiveData并控制数据更新LiveDataonActiveonInactive
| 归档时间: |
|
| 查看次数: |
2218 次 |
| 最近记录: |