Android集成Firebase报错无法解析dataSnapshot符号如何解决
问题根因
和Firebase SDK版本更新没有关系,是变量名不匹配导致的编译错误:
- 你重写的
onDataChange方法传入的参数名是snapshot,但方法内部调用的是未定义的dataSnapshot,IDE自然会标红提示变量未初始化。 - 你把调用名换成类名
DataSnapshot时,相当于在静态上下文调用非静态的实例方法child(),就会触发你看到的报错:
Non-static method 'child(java.lang.String)' cannot be referenced from a static context
修正方法
把方法内所有dataSnapshot替换为回调传入的实例参数snapshot即可,建议同步补全空判断、错误回调处理,避免运行时崩溃,修正后完整代码如下:
table_user.addValueEventListener(new ValueEventListener() { @Override public void onDataChange(@NonNull DataSnapshot snapshot) { String inputPhone = edtphone.getText().toString().trim(); String inputPassword = edtpass.getText().toString().trim(); if (snapshot.child(inputPhone).exists()) { mDialog.dismiss(); User user = snapshot.child(inputPhone).getValue(User.class); if (user != null && user.getPassword().equals(inputPassword)) { Toast.makeText(signin.this, "Sign In Successful", Toast.LENGTH_SHORT).show(); } else { Toast.makeText(signin.this, "Sign In Failed", Toast.LENGTH_SHORT).show(); } } else { Toast.makeText(signin.this, "User Not Found", Toast.LENGTH_SHORT).show(); } } @Override public void onCancelled(@NonNull DatabaseError error) { mDialog.dismiss(); Toast.makeText(signin.this, "Database request failed", Toast.LENGTH_SHORT).show(); } });
补充说明:
onDataChange的参数名支持自定义,如果你习惯用dataSnapshot作为变量名,直接把方法定义改成public void onDataChange(@NonNull DataSnapshot dataSnapshot),内部保持dataSnapshot.child()的写法也可以正常运行,只要方法内调用的变量名和参数声明的名称完全一致即可。
内容的提问来源于stack exchange,提问作者Ivor
相关产品推荐
相关产品推荐

