登录后无法加载Firebase数据库数据,报FormatException求助
问题分析与解决方案
核心问题定位
报错FormatException: Unexpected character (at character 1) | Error明确指向:调用json.decode(response.body)时,服务器返回的内容并非合法JSON格式,而是以|开头的错误文本。大概率是请求携带的认证令牌(authToken)无效或为空,导致Firebase返回错误信息而非目标数据。
具体排查与修复步骤
1. 修复authToken的传递逻辑
从主文件的ChangeNotifierProxyProvider代码来看:
ChangeNotifierProxyProvider<Auth, Properties>( create: (ctx) => Properties('', []), update: (ctx, auth, previousProperties) => Properties( auth.token, previousProperties == null ? [] : previousProperties.items, ), ),
create方法初始化Properties时传入了空字符串token,会导致首次调用fetchProperties时用无效令牌请求数据,直接触发错误。- 需确保
Auth类中的token是用户登录后获取的有效Firebase ID令牌,且update逻辑能正确将有效令牌传递给Properties实例。
2. 完善fetchProperties的错误处理与调试
当前代码未检查HTTP响应状态码,也未输出实际返回内容,无法精准定位问题。修改代码如下:
Future<void> fetchProperties() async { final url = Uri.https( 'aqarlibya-4d39c-default-rtdb.europe-west1.firebasedatabase.app', '/properties.json?auth=$authToken'); try { final response = await http.get(url); // 打印响应信息,用于调试 print('响应状态码: ${response.statusCode}'); print('响应内容: ${response.body}'); // 非200状态码直接抛出错误 if (response.statusCode != 200) { throw Exception('数据加载失败: ${response.body}'); } final extractedData = json.decode(response.body) as Map<String, dynamic>?; if (extractedData == null) { _items = []; notifyListeners(); return; } final List<Property> loadedProperties = []; extractedData.forEach((propId, propData) { loadedProperties.add(Property( id: propId, name: propData['name'], description: propData['description'], type: propData['type'], propertySize: propData['propertySize'], bedrooms: propData['bedrooms'], price: propData['price'], cityId: propData['cityId'], imageUrl: propData['imageUrl'], isFav: propData['isFav'] ?? false, // 增加空值默认处理,避免字段缺失崩溃 )); }); _items = loadedProperties; notifyListeners(); } catch (error) { print('获取数据错误: $error'); rethrow; } }
- 添加
print语句查看实际响应内容,确认是认证错误还是其他服务器问题。 - 检查响应状态码,非200时抛出包含响应体的错误,便于快速排查。
- 给
isFav字段增加空值默认处理,避免数据库中该字段缺失导致初始化Property实例时崩溃。
3. 控制数据获取时机
必须在用户成功登录并获取有效authToken后,再调用fetchProperties方法。可在Auth类的登录回调中触发数据获取,或在页面初始化时先判断authToken是否存在,再执行数据加载逻辑。
验证步骤
- 运行修改后的代码,查看控制台打印的响应状态码和内容。
- 若返回
401 Unauthorized,说明authToken无效,检查Auth类中获取令牌的逻辑是否正确。 - 若返回
200但响应体为空,需确认Firebase数据库中/properties节点是否存在数据。
内容的提问来源于stack exchange,提问作者kareem Alhoni
相关产品推荐
相关产品推荐

