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

Flutter接入Firebase实时数据库出现String不是int子类型错误如何解决

报错原因

type 'String' is not a subtype of type 'int' of 'index'错误本质是你使用字符串作为索引访问了数组类型的数据:Dart中List类型仅支持int类型的下标取值,只有Map类型才支持字符串key取值。

问题定位

你代码中触发报错的位置是FirebaseAnimatedList的itemBuilder回调里的取值逻辑:

return ListTile(
  title: Text(snapshot.value['Main Page']),
);

同时你的代码还存在两处基础语法问题:

  • initState方法没有补全闭合的},方法逻辑未正常结束
  • dbref变量没有提前声明类型,属于未定义变量

你当前的查询指向Firebase Realtime Database的根节点,若根节点存储的是数组结构的数据,snapshot.value会被解析为List<dynamic>类型,此时你传入字符串'Main Page'作为索引取值,就会直接触发类型不匹配报错。

修复方案

第一步:修正基础语法错误

补全代码结构,提前声明变量:

class _MyHomepageState extends State<MyHomepage> {
  // 提前声明数据库引用变量
  late DatabaseReference dbref;

  @override
  void initState() {
    super.initState();
    dbref = FirebaseDatabase.instance.reference();
  } // 补全initState的闭合大括号

第二步:修正取值逻辑

根据你的数据库结构二选一调整:

  • 如果你要拉取的是根节点下Main Page子节点的列表数据,直接修改查询的指向即可:
FirebaseAnimatedList(
  shrinkWrap: true,
  // 把查询指向对应子节点,不需要再从根节点取值
  query: dbref.child('Main Page'),
  itemBuilder: (BuildContext context, DataSnapshot snapshot,
      Animation animation, int index) {
    // 此时snapshot.value就是Main Page下对应索引的子项数据,按需取值即可
    return ListTile(
      title: Text(snapshot.value.toString()),
    );
  },
)
  • 如果你确实需要从根节点的返回值中取Main Page字段,先判断数据类型再取值,避免类型异常:
itemBuilder: (BuildContext context, DataSnapshot snapshot,
    Animation animation, int index) {
  final value = snapshot.value;
  String mainPageContent = '';
  // 先判断是Map类型再用字符串key取值
  if (value is Map) {
    mainPageContent = value['Main Page']?.toString() ?? '';
  }
  return ListTile(
    title: Text(mainPageContent),
  );
}

内容的提问来源于stack exchange,提问作者Ahmed Naeim

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.28 08:06:02