Flutter查询Firebase Realtime Database出现NoSuchMethodError报错
错误原因
该报错的核心诱因有3个:
- 查询逻辑错误导致返回结果为空:你直接对
null的snapshot.value调用['number']方法,触发了空指针异常 - 查询路径写错:你写的
.child('Subscribers').child('number')是直接定位到Subscribers节点下的number子节点,而正确逻辑是查询Subscribers节点下所有子条目中number字段和输入手机号匹配的条目 - 异步逻辑错位:你把跳转判断写在数据库请求的
then回调外面,会导致数据库还没返回结果,就已经执行了跳转判断,完全没有用到数据库的查询结果
修复方案
直接替换ElevatedButton的onPressed回调逻辑即可,修复后的代码如下:
onPressed: () async { var numberPhone = dialCodeDigits + _controller.text; // 先做输入校验,避免空提交 if (_controller.text.trim().isEmpty) { ScaffoldMessenger.of(context).showSnackBar(const SnackBar(content: Text("请输入手机号"))); return; } // 修正查询逻辑:按子字段number匹配查询 await FirebaseDatabase.instance .reference() .child('Subscribers') .orderByChild('number') .equalTo(numberPhone) .once() .then((DataSnapshot snapshot) { // 先判空,存在匹配结果再跳转 if (snapshot.value != null) { Navigator.of(context).push(MaterialPageRoute( builder: (c) => OTPController( phoneNumber: _controller.text, codeDigit: dialCodeDigits))); } else { // 无匹配结果抛出提示 ScaffoldMessenger.of(context).showSnackBar(const SnackBar(content: Text("该手机号未在系统中注册"))); } }); }
额外注意事项
- 原代码中硬编码的手机号判断逻辑可以直接删除,现在已经完全走数据库匹配
- 请确认你的Firebase Realtime Database规则开放了
Subscribers节点的读权限,权限不足也会导致返回结果为null - 如果你的
Subscribers节点下是直接存储手机号、没有嵌套number字段,自行调整查询逻辑,直接判断snapshot.value和输入手机号是否相等即可
内容的提问来源于stack exchange,提问作者ashish rana
相关产品推荐
相关产品推荐

