参数类型“Stream<List<ObjectModel>>”不能分配给参数类型“List<ObjectModel>”

Posted

技术标签:

【中文标题】参数类型“Stream<List<ObjectModel>>”不能分配给参数类型“List<ObjectModel>”【英文标题】:The argument type 'Stream<List<ObjectModel>>' can't be assigned to the parameter type 'List<ObjectModel>' 【发布时间】:2021-11-05 18:08:20 【问题描述】:

我正在使用 BLoC 模式(带有 rxdart 包)来读取“EmpresaDatosModel”列表,当尝试包含接收器时,它会抛出以下错误:

参数类型'Stream >'不能是 分配给参数类型'List '。

在 BLoC 模式中,我使用以下代码:

class EmpresaDatosBloc 

  final _empresaDatosController = new BehaviorSubject<List<EmpresaDatosModel>>();
  Stream <List<EmpresaDatosModel>>  get empresaDatosStream   => _empresaDatosController.stream;

  Stream<List<EmpresaDatosModel>> cargarEmpresasStream() 
    final empresasList = _empresaDatosProvider.cargarEmpresasStream();

    _empresaDatosController.sink.add(empresasList); //THE ERROR THROWS HERE

    return empresasList;
  
  dispose() 
    _empresaDatosController?.close();
  

从 Firebase RTDB 进行查询的提供程序具有以下内容:

  Stream<List<EmpresaDatosModel>> cargarEmpresasStream() 
    
    Query resp = db.child('admon');
    final empStream = resp.onValue;

    final publicarStream = empStream.map((event) 
      final empMap = Map<String, dynamic>.from(event.snapshot.value);
      final empList = empMap.entries.map((e) 
        return EmpresaDatosModel.fromJson(Map<String,dynamic>.from(e.value));
      ).toList();
      return empList;
    );
    return publicarStream;
  

显示小部件如下所示:

    final empresaDatosBloc = Provider.empresaDatosBloc(context);
    empresaDatosBloc.cargarEmpresasStream();
    //---
    return StreamBuilder(
         stream: empresaDatosBloc.empresaDatosStream, 
         builder: (BuildContext context, snapshot)
                  final empresasList = [];
                  if (snapshot.hasData) 
                    final myList = snapshot.data as List<EmpresaDatosModel>;

                    myList.forEach((element) 
                      empresasList.add(element);
                    );
                  

如何将List&lt;EmpresaDatosModel&gt; 分配给接收器以修复错误?

【问题讨论】:

【参考方案1】:

您可以拨打.addStream_empresaDatosControllerBehaviorSubject

这会将数据和错误事件转发到控制器的流。

    _empresaDatosController.addStream(empresasList);

【讨论】:

谢谢@victoreonmosele。它工作正常。但是,当我切换到另一个屏幕并返回时出现错误:Bad state: You cannot add items while items are being added from addStream。我能修好吗? 您是否在您拥有StreamBuilder 的小部件的 dispose 方法中处理该块? 是的,我想是的。我正在使用dispose()_empresaDatosController?.close(); 明确地说,我在 BLoC 中使用 dispose。我有 Streambuilder 的地方是 StatelessWidget 我将 SatelessWidget 转换为 StatefulWidget 以便处理 StreamBuilder 正在工作的 empresaDatosBloc,但出现相同的错误:Bad state: You cannot add items while items are being added from addStream【参考方案2】:

希望能帮到你。 只需保留对StreamSubscription 的引用并使用Stream.listen() 方法


class EmpresaDatosBloc 
  StreamSubscription<void>? _subscription;

  final _empresaDatosController = new BehaviorSubject<List<EmpresaDatosModel>>();
  Stream <List<EmpresaDatosModel>>  get empresaDatosStream   => _empresaDatosController.stream;

  void cargarEmpresasStream() 
    _subscription?.cancel();
    _subscription = _empresaDatosProvider.cargarEmpresasStream()
      .listen(_empresaDatosController.add, onError: _empresaDatosController.addError);
  
  dispose() 
    _subscription?.cancel();
    _empresaDatosController?.close();
  

【讨论】:

完美运行!!您推荐使用 Streambuilder 在小部件中使用 Stateful 还是 Stateless? IMO,应该是无状态的 为什么? dispose函数不方便? @DavidL 使用 Stateful 来包含和处理 bloc(是必需的)(例如 Screen/Page),否则尽可能使用 Stateless

以上是关于参数类型“Stream<List<ObjectModel>>”不能分配给参数类型“List<ObjectModel>”的主要内容,如果未能解决你的问题,请参考以下文章

获取错误“未知”类型的参数不能分配给“错误”类型的参数 |空值'

给定传递给它的参数类型,如何确定函数参数的类型?

参数类型“Type”不能分配给参数类型“FirebaseUser”

类型提示,其中一个参数是另一个参数的类型

参数类型“对象?”不能分配给参数类型'String'最新版本

Python参数类型以及常见的坑