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

Flutter集成Firebase实时数据库遇类型转换错误:_Map转Map失败

解决Firebase实时数据库Flutter数据展示的类型转换错误

错误原因

你遇到的type '_Map<Object?, Object?>' is not a subtype of type 'Map<String?, dynamic>'错误,核心原因是Firebase实时数据库返回的dataSnapshot.value实际类型为Map<Object?, Object?>,代码中直接强制转换为Map<String?, dynamic>导致类型不兼容。同时处理bettingTips时也存在类似的类型风险。

修复方案

1. 安全转换顶层数据类型

避免直接强转,先将Object?类型的value转为Map,再通过Map<String, dynamic>.from()安全转换键值类型:

final rawData = dataSnapshot.value as Map?;
if (rawData != null) {
  rawData.forEach((key, value) {
    final tipMap = Map<String, dynamic>.from(value as Map);
    tips.add(tipMap);
  });
}

2. 安全处理嵌套的bettingTips

对bettingTips做类型判断和空值校验,避免类型转换失败:

final bettingTips = tip['betting_tips'] as Map?;
final odds = <String>[];
if (bettingTips != null) {
  bettingTips.forEach((key, value) {
    final oddsValue = (value as Map)['odds']?.toString();
    if (oddsValue != null) {
      odds.add(oddsValue);
    }
  });
}

3. 增加字段空值防护

对从tip中取出的字段添加空值处理,避免Text组件接收null导致崩溃:

final homeTeamName = tip['home_team_name']?.toString() ?? '未知';
final awayTeamName = tip['away_team_name']?.toString() ?? '未知';
final scoreFulltime = tip['score_fulltime']?.toString() ?? '暂无';

修改后的完整代码

import 'package:flutter/material.dart';
import 'package:firebase_database/firebase_database.dart';

class DailyTipsScreen extends StatefulWidget {
  const DailyTipsScreen({Key? key}) : super(key: key);

  @override
  State<DailyTipsScreen> createState() => _DailyTipsScreenState();
}

class _DailyTipsScreenState extends State<DailyTipsScreen> {
  late DatabaseReference tipsRef;

  @override
  void initState() {
    super.initState();
    tipsRef = FirebaseDatabase.instance.ref().child('tips');
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: const Text('Tips'),
      ),
      body: StreamBuilder<DatabaseEvent>(
        stream: tipsRef.onValue,
        builder: (context, snapshot) {
          if (!snapshot.hasData) {
            return const Center(
              child: CircularProgressIndicator(),
            );
          }

          final tips = <Map<String, dynamic>>[];
          final dataSnapshot = snapshot.data!.snapshot;
          final rawData = dataSnapshot.value as Map?;

          if (rawData != null) {
            rawData.forEach((key, value) {
              final tipMap = Map<String, dynamic>.from(value as Map);
              tips.add(tipMap);
            });
          }

          return ListView.builder(
            itemCount: tips.length,
            itemBuilder: (context, index) {
              final tip = tips[index];
              final homeTeamName = tip['home_team_name']?.toString() ?? '未知';
              final awayTeamName = tip['away_team_name']?.toString() ?? '未知';
              final scoreFulltime = tip['score_fulltime']?.toString() ?? '暂无';
              final bettingTips = tip['betting_tips'] as Map?;

              final odds = <String>[];
              if (bettingTips != null) {
                bettingTips.forEach((key, value) {
                  final oddsValue = (value as Map)['odds']?.toString();
                  if (oddsValue != null) {
                    odds.add(oddsValue);
                  }
                });
              }
              final oddsString = odds.isNotEmpty ? odds.join(' / ') : '暂无';

              return ListTile(
                title: Text('$homeTeamName vs $awayTeamName'),
                subtitle: Text('Score: $scoreFulltime, Odds: $oddsString'),
              );
            },
          );
        },
      ),
    );
  }
}

内容的提问来源于stack exchange,提问作者Jesse Josiah

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.26 15:23:29