你能帮我吗?我尝试使用 firebase 从数据层获取数据。但我收到以下错误:
E 致命异常:主要 进程:com.example.mvvmlesson,PID:12328 java.lang.IllegalArgumentException:路径不能为空。 在 com.squareup.picasso.Picasso.load(Picasso.java:332) 在 com.example.mvvmlesson.ui.GameFragment$observeViewModel$1.invoke(GameFragment.kt:54) 在 com.example.mvvmlesson.ui.GameFragment$observeViewModel$1.invoke(GameFragment.kt:53) 在 com.example.mvvmlesson.ui.GameFragment$sam$androidx_lifecycle_Observer$0.onChanged(来源未知:2) 在 androidx.lifecycle.LiveData.considerNotify(LiveData.java:133) 在 androidx.lifecycle.LiveData.dispatchingValue(LiveData.java:146) 在 androidx.lifecycle.LiveData$ObserverWrapper.activeStateChanged(LiveData.java:483) 在 androidx.lifecycle.LiveData$LifecycleBoundObserver.onStateChanged(LiveData.java:440) 在 androidx.lifecycle.LifecycleRegistry$ObserverWithState.dispatchEvent(LifecycleRegistry.kt:314) 在 androidx.lifecycle.LifecycleRegistry.forwardPass(LifecycleRegistry.kt:251) 在 androidx.lifecycle.LifecycleRegistry.sync(LifecycleRegistry.kt:287) 在 androidx.lifecycle.LifecycleRegistry.moveToState(LifecycleRegistry.kt:136) 在 androidx.lifecycle.LifecycleRegistry.handleLifecycleEvent(LifecycleRegistry.kt:119) 在 androidx.fragment.app.FragmentViewLifecycleOwner.handleLifecycleEvent(FragmentViewLifecycleOwner.java:100) 在 androidx.fragment.app.Fragment.performStart(Fragment.java:3194) 在 androidx.fragment.app.FragmentStateManager.start(FragmentStateManager.java:628) 在 androidx.fragment.app.FragmentStateManager.moveToExpectedState(FragmentStateManager.java:290) 在 androidx.fragment.app.FragmentManager.executeOpsTogether(FragmentManager.java:1943) 在 androidx.fragment.app.FragmentManager.removeRedundantOperationsAndExecute(FragmentManager.java:1845) 在 androidx.fragment.app.FragmentManager.execPendingActions(FragmentManager.java:1782) 在 androidx.fragment.app.FragmentManager$5.run(FragmentManager.java:565) 在 android.os.Handler.handleCallback(Handler.java:958) 在 android.os.Handler.dispatchMessage(Handler.java:99) 在 android.os.Looper.loopOnce(Looper.java:205) 在 android.os.Looper.loop(Looper.java:294) 在 android.app.ActivityThread.main(ActivityThread.java:8176) 在 java.lang.reflect.Method.invoke(本机方法) 在 com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:552) 在 com.android.internal.os.ZygoteInit.main(ZygoteInit.java:971)
class GameFragment : Fragment() {
private val viewModel: GameViewModel by lazy {
ViewModelProvider(
this,
ViewModelProvider.AndroidViewModelFactory.getInstance(requireActivity().application)
)[GameViewModel::class.java]
}
private var _binding: FragmentGameBinding? = null
private val binding: FragmentGameBinding
get() = _binding!!
override fun onCreateView(
inflater: LayoutInflater, container: ViewGroup?,
savedInstanceState: Bundle?
): View? {
_binding = FragmentGameBinding.inflate(inflater, container, false)
return binding.root
}
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
observeViewModel()
}
private fun observeViewModel() {
viewModel.question.observe(viewLifecycleOwner) {
Picasso.get().load(it.image.toString()).into(binding.imageViewQuestion)
}
}
}
class GameViewModel: ViewModel() {
private val repository = GameRepositoryImpl
private val generateQuestionUseCase = GenerateQuestionUseCase(repository)
private val _question = MutableLiveData<Question>()
val question: LiveData<Question>
# get() = _question
fun startGame() {
generateQuestion()
}
private fun generateQuestion() {
_question.value = generateQuestionUseCase()
}
}
object GameRepositoryImpl: GameRepository {
override fun generateQuestion(): Question {
val questionGame = Question("", "")
val db = Firebase.firestore
val random = (1..5).random()
val question = db.collection("MOVIES").document(random.toString())
question.get().addOnSuccessListener { document ->
val quest = document.toObject<Question>()
if (quest != null) {
questionGame.answer = quest.answer.toString()
questionGame.image = quest.image.toString()
}
}
return questionGame
}
}
class GenerateQuestionUseCase (private val repository: GameRepository) {
operator fun invoke(): Question {
return repository.generateQuestion()
}
}
interface GameRepository {
fun generateQuestion(): Question
}
在您的存储库中,问题的初始值为空(答案和图像)。检查您在视图模型中收到的值,因为错误显示为
java.lang.IllegalArgumentException: Path must not be empty
。所以我猜测 generateQuestion()
返回空值,因为操作尚未完成。可能您需要处理对 Firebase 的异步调用,使用回调并传播它或使用挂起协程。
例如:
`fun generateQuestion(onQuestionLoaded: (Question) -> Unit) {
val db = Firebase.firestore
val random = (1..5).random()
val question = db.collection("MOVIES").document(random.toString())
question.get().addOnSuccessListener { document ->
val question = document.toObject<Question>()
question?.let{
onQuestionLoaded(it)
}
}
}`