Flutter中List<Object?>转List<Object>类型转换错误修复求助
修复Firestore流监听中的
List<Object?>到List<Object>类型转换错误 问题根源
你的错误源于mapSnapshotToObject方法可能返回可空类型(Object?),导致snapshot.docs.map(...).toList()生成的是List<Object?>,而Dart中不可空的List<Object>和可空的List<Object?>是不同的类型,无法通过as List<Object>直接强制转换。
修复方案
根据你的代码逻辑(最终暴露的是Stream<List<Journey>>),推荐以下两种更类型安全的修复方式:
方案1:统一使用Journey类型(推荐)
既然你的getList返回的是Stream<List<Journey>>,直接将控制器的类型改为List<Journey>,同时确保mapSnapshotToObject返回非空的Journey实例:
late StreamSubscription _listener; // 把控制器类型改为List<Journey>,和最终暴露的流类型一致 final _controller = BehaviorSubject<List<Journey>>(); Stream<List<Journey>> get getList => _controller.stream.distinct(); Stream<QuerySnapshot<Map<dynamic, dynamic>>> firestoredataStream = FirebaseFirestore.instance .collection('journeys') .where('userID', isEqualTo: _user.email) .snapshots(); _listener = firestoredataStream.listen((QuerySnapshot snapshot) { if (snapshot.docs.isNotEmpty) { // 直接转换为Journey列表,无需强转Object final journeyList = snapshot.docs .map((doc) => mapSnapshotToObject(doc)) // 若mapSnapshotToObject可能返回null,添加过滤确保非空 .whereType<Journey>() .toList(); _controller.add(journeyList); } });
方案2:过滤空值并转换类型(兼容可能的null场景)
如果确实需要保留Object类型,先过滤掉列表中的null元素,再通过cast<Object>转换类型:
_listener = firestoredataStream.listen((QuerySnapshot snapshot) { if (snapshot.docs.isNotEmpty) { final objectList = snapshot.docs .map((doc) => mapSnapshotToObject(doc)) // 过滤所有null元素 .where((item) => item != null) // 将List<Object?>转换为List<Object> .cast<Object>() .toList(); _controller.add(objectList); } });
关键说明
Dart的泛型系统中,List<Object?>和List<Object>不是协变类型,不能直接强制转换。必须通过过滤空值或确保元素非空的方式,生成真正的List<Object>实例,才能避免类型转换错误。
内容的提问来源于stack exchange,提问作者Chandan Gudigar
相关产品推荐
相关产品推荐

