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
相关产品推荐
相关产品推荐

