Flutter上传蓝牙数据到Firebase Firestore报错:参数无效,存在DeviceIdentifier实例
报错原因与解决方案
报错产生原因
- Firestore仅支持写入字符串、数字、布尔值、List、Map、Timestamp、null等基础数据类型,不支持直接写入自定义类的实例对象。
DeviceIdentifier是Flutter常用蓝牙依赖库(如flutter_blue、flutter_blue_plus)内部定义的类,你传入addBluetoothInfo方法的id参数实际是DeviceIdentifier类的实例,而非预期的ID字符串,未做类型转换就直接存入Map写入Firestore,就会触发解析异常。- 除此之外你传入的
type、services等参数也可能是蓝牙库的自定义类实例,同样会触发同类报错。
解决方案
- 对
id参数做类型转换:调用DeviceIdentifier实例的toString()方法,转为字符串后再存入Map。 - 检查所有入参的类型:所有蓝牙库返回的自定义类对象都要取出你需要的基础类型字段后再存储,比如
services是BluetoothService实例列表,你需要遍历取出每个服务的uuid、属性等字段,转成基础类型的List/Map后再存入。 - 可以在存Map前先对每个字段做类型校验,避免遗漏非基础类型参数。
修改后的参考代码
addBluetoothInfo(var id, var name, var type, var isDiscoveringServices, var services) async { Map<String, dynamic> map = Map(); // 把DeviceIdentifier实例转成字符串 map['id'] = id.toString(); map['name'] = name; // 如果type也是自定义枚举/类,也做对应转换 map['type'] = type.toString(); map['isDiscoveringServices'] = isDiscoveringServices; // 处理services,示例只存服务uuid,可根据需求提取其他字段 List<String> serviceUuidList = services.map((service) => service.uuid.toString()).toList(); map['services'] = serviceUuidList; await bluetoothRef.add(map).then((value) => print(value)).whenComplete( () { print('done'); }, ); }
内容的提问来源于stack exchange,提问作者Amin Mirzakuchaki
相关产品推荐
相关产品推荐

