Flutter结合Getx、Firebase时Stream嵌套列表类型不匹配报错如何解决
类型不匹配问题解决
错误原因
你自定义的stream()方法返回类型为Stream<List<List<NewsModel>>>,每次事件返回的是包含今日、昨日两个NewsModel列表的嵌套列表,而bindStream要求传入的流类型必须和RxList的泛型一致,也就是Stream<List<NewsModel>>,二者类型不匹配所以触发报错。
同时你原本的写法会对同一个Firestore文档快照发起两次监听,反而会翻倍读取次数,不符合你降低成本的需求。
最优解决方案
仅对Firestore快照做一次监听,在事件回调中分别给两个RxList赋值即可,既解决类型问题,也只会产生1次读取计数:
import 'package:cloud_firestore/cloud_firestore.dart'; import 'package:dummy_app/models/NewsModel.dart'; import 'package:get/get.dart'; class FirebaseController extends GetxController { // 定义流订阅实例,用于控制器销毁时取消监听避免内存泄漏 StreamSubscription<DocumentSnapshot>? newsStreamSub; @override void onInit() { _initNewsStream(); super.onInit(); } void _initNewsStream() { newsStreamSub = FirebaseFirestore.instance .collection('news') .doc("Business") .snapshots() .listen((ds) { final mapData = ds.data(); if (mapData == null) return; final stringToday = mapData['today'] as String; final stringYesterday = mapData['yesterday'] as String; final mapListToday = mapData[stringToday] as List; final mapListYesterday = mapData[stringYesterday] as List; // 直接给可观测列表赋值,自动触发响应式更新 newsModelList.value = mapListToday.map((e) => NewsModel.fromMap(e)).toList(); newsModelListYesterday.value = mapListYesterday.map((e) => NewsModel.fromMap(e)).toList(); }); } RxList<NewsModel> newsModelList = <NewsModel>[].obs; RxList<NewsModel> newsModelListYesterday = <NewsModel>[].obs; @override void onClose() { newsStreamSub?.cancel(); super.onClose(); } }
可选方案(不推荐)
如果你一定要保留bindStream的写法,可以对原嵌套列表流做拆分映射,但该方案会发起两次Firestore监听,读取次数翻倍:
@override void onInit() { // 拆分映射出今日列表流 final todayStream = stream().map((nestedList) => nestedList[0]); // 拆分映射出昨日列表流 final yesterdayStream = stream().map((nestedList) => nestedList[1]); newsModelList.bindStream(todayStream); newsModelListYesterday.bindStream(yesterdayStream); super.onInit(); }
内容的提问来源于stack exchange,提问作者Raj A
相关产品推荐
相关产品推荐

