You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

登录后无法加载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是否存在,再执行数据加载逻辑。

验证步骤

  1. 运行修改后的代码,查看控制台打印的响应状态码和内容。
  2. 若返回401 Unauthorized,说明authToken无效,检查Auth类中获取令牌的逻辑是否正确。
  3. 若返回200但响应体为空,需确认Firebase数据库中/properties节点是否存在数据。

内容的提问来源于stack exchange,提问作者kareem Alhoni

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.13 19:10:51