从数据层获取数据

问题描述 投票:0回答:1

你能帮我吗?我尝试使用 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
}
kotlin mvvm repository
1个回答
0
投票

在您的存储库中,问题的初始值为空(答案和图像)。检查您在视图模型中收到的值,因为错误显示为

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)
         } 
     }
}` 
© www.soinside.com 2019 - 2024. All rights reserved.