android - 不知道 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()
}
}
}
}
解决方案
在片段生命周期中,onCreate()
在onCreateView()
. 您正在尝试binding
在初始化之前使用它。
将需要的代码移至binding
生命onCreateView()
周期阶段或更高的生命周期阶段。
推荐阅读
- java - Java 运行时环境检测到致命错误:libjvm.dylib
- gtk - 如何释放 Gtk::Button?
- android - 在不同的活动中测试两个文本
- r - ld:警告:基于文本的存根文件不同步。回退到库文件进行链接
- polymer-3.x - 我们如何安装 mwc-menu
- php - 这是否符合能够防止 SQL 注入黑客攻击的准备好的语句?
- python - 包含列表的字典
- scala - Scala不适用于泛型参数
- javascript - 淡化没有立即连接到悬停在 d3 图中的节点的链接和节点
- c++ - 如何在派生类中不显式调用 Base::func() 的情况下从基类执行虚函数?