为什么我要将错误片段附加到上下文?

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

这是我的代码,我正试图从主要活动转移到这里,早些时候它正在工作,但在实施电话验证后它不工作,idk 我哪里出错了...................... ..................................................... ...................................................

package com.example.ecommerce.fragments

import android.annotation.SuppressLint
import android.content.Context
import android.content.Intent
import android.os.Bundle
import androidx.fragment.app.Fragment
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import android.widget.Toast
import androidx.appcompat.app.AlertDialog
import com.example.ecommerce.RegisterAct
import com.example.ecommerce.databinding.FragmentMoreBinding
import com.google.firebase.FirebaseException
import com.google.firebase.auth.*
import com.google.firebase.ktx.Firebase
import java.util.concurrent.TimeUnit

class MoreFragment : Fragment() {
  private lateinit var binding: FragmentMoreBinding
   private val builder= AlertDialog.Builder(requireContext()).setTitle("Loading.....").setMessage("Please wait").setCancelable(false).create()

    private var activityContext: Context? = null



    override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
        super.onViewCreated(view, savedInstanceState)
        val context = activityContext ?: return
        // Use context here
    }


    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
    }

    @SuppressLint("SuspiciousIndentation")
    override fun onCreateView(
        inflater: LayoutInflater, container: ViewGroup?,
        savedInstanceState: Bundle?
    ): View? {
      binding=FragmentMoreBinding.inflate(layoutInflater)
       if(FirebaseAuth.getInstance().currentUser!=null) {
         binding.login.visibility=View.GONE
           binding.textView5.visibility=View.GONE
           return view
       }



binding.login.setOnClickListener {
    binding.constraint.visibility=View.VISIBLE
    binding.cont.setOnClickListener {
       auth()
    }
}


        binding.remove.setOnClickListener {
            binding.constraint.visibility=View.GONE
        }

 binding.register.setOnClickListener{
     val intent=Intent(requireContext(),RegisterAct::class.java)
     startActivity(intent)
 }

        return binding.root
    }

    override fun onAttach(context: Context) {
        super.onAttach(context)
        activityContext = context
    }

    override fun onDetach() {
        super.onDetach()
    }

    private fun auth() {



        if(binding.Phonenumber.text.isEmpty() || binding.editTextPhone.text.isEmpty())  {
            Toast.makeText(requireContext(), "Please fill everything", Toast.LENGTH_SHORT).show()
        }  else if (binding.editTextPhone.text.toString().trim().length != 2 ) {
            Toast.makeText(requireContext(), "Invalid country code", Toast.LENGTH_SHORT).show()
        }  else if(binding.Phonenumber.text.trim().length != 10 ) {
            Toast.makeText(requireContext(), "Invalid Phone number", Toast.LENGTH_SHORT).show()
        }  else {
                otpbhej(binding.editTextPhone.text.toString(),binding.Phonenumber.text.toString())
            builder.show()
        }
    }

    private fun otpbhej(Cc: String, phoneNumber: String) {
        val options = PhoneAuthOptions.newBuilder(FirebaseAuth.getInstance())
            .setPhoneNumber("+" + Cc + phoneNumber) // Phone number to verify
            .setTimeout(60L, TimeUnit.SECONDS) // Timeout and unit
            .setActivity(requireActivity()) // Activity (for callback binding)
            .setCallbacks(callbacks) // OnVerificationStateChangedCallbacks
            .build()
        PhoneAuthProvider.verifyPhoneNumber(options)
    }

   val callbacks = object : PhoneAuthProvider.OnVerificationStateChangedCallbacks() {

        override fun onVerificationCompleted(credential: PhoneAuthCredential) {

        }

        override fun onVerificationFailed(e: FirebaseException) {

        }

        override fun onCodeSent(
            verificationId: String,
            token: PhoneAuthProvider.ForceResendingToken,
        ) {
            binding.Phonenumber.visibility=View.GONE
            binding.editTextPhone.visibility=View.GONE
            builder.dismiss()
            binding.OtpNumber.visibility=View.VISIBLE
            if(binding.OtpNumber.text.isNotEmpty()) {
                checkOTP(verificationId,binding.OtpNumber.text.toString())
            }

        }
    }

    private fun checkOTP(verificationId: String, code: String) {
        val credential = PhoneAuthProvider.getCredential(verificationId!!, code)
        signInWithPhoneAuthCredential(credential)
    }

    private fun signInWithPhoneAuthCredential(credential: PhoneAuthCredential) {
        FirebaseAuth.getInstance().signInWithCredential(credential)
            .addOnCompleteListener(requireActivity()) { task ->
                if (task.isSuccessful) {
                    Toast.makeText(requireContext(), "You are signed in", Toast.LENGTH_SHORT).show()

                    val user = task.result?.user
                } else {
                    Toast.makeText(requireContext(), "Something went wrong", Toast.LENGTH_SHORT).show()
                }
            }
    }

}

不知道为什么我会收到这个错误

`

 Process: com.example.ecommerce, PID: 4130
    java.lang.IllegalStateException: Fragment MoreFragment{f2ca588} (0a0f4eb7-5df8-4d00-aa6d-18838fd9f570) not attached to a context.
        at androidx.fragment.app.Fragment.requireContext(Fragment.java:967)
        at com.example.ecommerce.fragments.MoreFragment.<init>(MoreFragment.kt:22)
        at com.example.ecommerce.MainActivity$onCreate$2.invoke(MainActivity.kt:37)
        at com.example.ecommerce.MainActivity$onCreate$2.invoke(MainActivity.kt:31)
        at me.ibrahimsn.lib.SmoothBottomBar$setOnItemSelectedListener$1.onItemSelect(SmoothBottomBar.kt:613)
        at me.ibrahimsn.lib.SmoothBottomBar.onClickAction(SmoothBottomBar.kt:541)
        at me.ibrahimsn.lib.SmoothBottomBar.onTouchEvent(SmoothBottomBar.kt:523)
        at android.view.View.dispatchTouchEvent(View.java:14632)
        at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:3169)
        at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2845)
        at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:3169)
        at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2845)
        at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:3169)
        at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2845)
        at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:3169)
        at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2845)
        at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:3169)
        at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2845)
        at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:3169)
        at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2845)
        at com.android.internal.policy.DecorView.superDispatchTouchEvent(DecorView.java:573)
        at com.android.internal.policy.PhoneWindow.superDispatchTouchEvent(PhoneWindow.java:1911)
        at android.app.Activity.dispatchTouchEvent(Activity.java:4256)
        at androidx.appcompat.view.WindowCallbackWrapper.dispatchTouchEvent(WindowCallbackWrapper.java:70)
        at com.android.internal.policy.DecorView.dispatchTouchEvent(DecorView.java:521)
        at android.view.View.dispatchPointerEvent(View.java:14899)
        at android.view.ViewRootImpl$ViewPostImeInputStage.processPointerEvent(ViewRootImpl.java:6755)
        at android.view.ViewRootImpl$ViewPostImeInputStage.onProcess(ViewRootImpl.java:6526)
        at android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:5995)
        at android.view.ViewRootImpl$InputStage.onDeliverToNext(ViewRootImpl.java:6057)
        at android.view.ViewRootImpl$InputStage.forward(ViewRootImpl.java:6018)
        at android.view.ViewRootImpl$AsyncInputStage.forward(ViewRootImpl.java:6192)
        at android.view.ViewRootImpl$InputStage.apply(ViewRootImpl.java:6026)
        at android.view.ViewRootImpl$AsyncInputStage.apply(ViewRootImpl.java:6249)
        at android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:5999)
        at android.view.ViewRootImpl$InputStage.onDeliverToNext(ViewRootImpl.java:6057)
        at android.view.ViewRootImpl$InputStage.forward(ViewRootImpl.java:6018)
        at android.view.ViewRootImpl$InputStage.apply(ViewRootImpl.java:6026)
        at android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:5999)
        at android.view.ViewRootImpl.deliverInputEvent(ViewRootImpl.java:9034)
        at android.view.ViewRootImpl.doProcessInputEvents(ViewRootImpl.java:8985)
        at android.view.ViewRootImpl.enqueueInputEvent(ViewRootImpl.java:8941)
        at android.view.ViewRootImpl$WindowInputEventReceiver.onInputEvent(ViewRootImpl.java:9177)
        at android.view.InputEventReceiver.dispatchInputEvent(InputEventReceiver.java:266)
        at android.os.MessageQueue.nativePollOnce(Native Method)
        at android.os.MessageQueue.next(MessageQueue.java:339)
        at android.os.Looper.loopOnce(Looper.java:179)
        at android.os.Looper.loop(Looper.java:344)
        at android.app.ActivityThread.main(ActivityThread.java:8212)
        at java.lang.reflect.Method.invoke(Native Method)
        at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:584)
E/AndroidRuntime:     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1034)
I/Process: Sending signal. PID: 4130 SIG: 9

android firebase kotlin android-fragments fragment
1个回答
0
投票

发生此错误是因为您在 Fragment 未附加到任何上下文(在构造函数中)时试图获取上下文。片段仅在 Fragment.onAttach(context) 方法中附加到上下文。

只有在 Fragment 获得此上下文后,您才必须调用 requireContext()。例如,在 onCreateView() 方法中。

class MoreFragment : Fragment() {
    private lateinit var builder: AlertDialog.Builder

    override fun onCreateView(
        inflater: LayoutInflater, container: ViewGroup?,
        savedInstanceState: Bundle?
    ): View? {
       builder= AlertDialog.Builder(requireContext()).setTitle("Loading.....").setMessage("Please wait").setCancelable(false).create()
     ...
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.