首页 > 解决方案 > 不知道 NullPoniter 的确切问题

问题描述

我正在创建一个 FireBase 电话身份验证应用程序。我有 2 个片段:1. 用于获取用户的电话号码 2. 用于 OTP 验证。我想在 EdiText 提交 6 位数字时自动验证 OTP。

我做了与教程中所示完全相同的操作。请帮助我。

我已经阅读/试图理解这一点: 什么是 NullPointerException,我该如何解决?

第 23 和 43 行是:

private val binding get() = _binding!!

binding.etOtp.addTextChangedListener(textWatcher)

这是我的日志:

--------- beginning of crash
2021-01-27 15:49:44.430 11355-11355/com.techfan.firebasetest E/AndroidRuntime: FATAL EXCEPTION: main
    Process: com.techfan.firebasetest, PID: 11355
    java.lang.NullPointerException
        at com.techfan.firebasetest.fragments.OTPFragment.getBinding(OTPFragment.kt:23)
        at com.techfan.firebasetest.fragments.OTPFragment.onCreate(OTPFragment.kt:43)
        at androidx.fragment.app.Fragment.performCreate(Fragment.java:2684)
        at androidx.fragment.app.FragmentStateManager.create(FragmentStateManager.java:280)
        at androidx.fragment.app.FragmentManager.moveToState(FragmentManager.java:1175)
        at androidx.fragment.app.FragmentManager.addAddedFragments(FragmentManager.java:2224)
        at androidx.fragment.app.FragmentManager.executeOpsTogether(FragmentManager.java:1997)
        at androidx.fragment.app.FragmentManager.removeRedundantOperationsAndExecute(FragmentManager.java:1953)
        at androidx.fragment.app.FragmentManager.execPendingActions(FragmentManager.java:1849)
        at androidx.fragment.app.FragmentManager$4.run(FragmentManager.java:413)
        at android.os.Handler.handleCallback(Handler.java:938)
        at android.os.Handler.dispatchMessage(Handler.java:99)
        at android.os.Looper.loop(Looper.java:223)
        at android.app.ActivityThread.main(ActivityThread.java:7656)
        at java.lang.reflect.Method.invoke(Native Method)
        at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:592)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:947)

这是我到目前为止所做的:

class OTPFragment : Fragment() {

    private var _binding: FragmentOtpBinding? = null
    private val binding get() = _binding!!

    var storedVerificationId: String? = null

    lateinit var auth: FirebaseAuth

    override fun onCreateView(
        inflater: LayoutInflater, container: ViewGroup?,
        savedInstanceState: Bundle?
    ): View {
        _binding = FragmentOtpBinding.inflate(inflater, container, false)

        return binding.root
    }

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

        storedVerificationId = arguments?.getString("toSend")

        binding.etOtp.addTextChangedListener(textWatcher)

        auth=FirebaseAuth.getInstance()
    }

    private val textWatcher = object : TextWatcher {
        override fun afterTextChanged(s: Editable?) {
        }
        override fun beforeTextChanged(s: CharSequence?, start: Int, count: Int, after: Int) {
        }
        override fun onTextChanged(s: CharSequence?, start: Int, before: Int, count: Int) {
            if (start == 6) {
                val otp=binding.etOtp.text.toString().trim()
                if(otp.isNotEmpty()){
                    val credential : PhoneAuthCredential = PhoneAuthProvider.getCredential(
                        storedVerificationId.toString(), otp)
                    signInWithPhoneAuthCredential(credential)
                }
            }
        }
    }

    private fun signInWithPhoneAuthCredential(credential: PhoneAuthCredential) {
        auth.signInWithCredential(credential)
            .addOnCompleteListener(this.requireActivity()) { task ->
                if (task.isSuccessful) {
                    startActivity(Intent(activity?.applicationContext, DashboardActivity::class.java))
                    activity?.finish()
                }
            }
    }
}

标签: androidfirebasekotlinnullpointerexception

解决方案


在片段生命周期中,onCreate()onCreateView(). 您正在尝试binding在初始化之前使用它。

将需要的代码移至binding生命onCreateView()周期阶段或更高的生命周期阶段。


推荐阅读