StreamBuilder flutter

问题描述 投票:0回答:3

我在列表中添加了两个项目,然后将列表添加到接收器。

var list = new List<String>();
AbcBloc _abcBloc = AbcBloc(repository: null);

 @override
  void didChangeDependencies() {
    _abcBloc = Provider.of<AbcBloc>(context);
    super.didChangeDependencies();
  }

@override
  void initState() {
    super.initState();

    list.add('Electrical');
    list.add('Inspection');

    _abcBloc.listSink.add(list);
  }

但是当我尝试在TextField中打印列表时,它显示为空吗?

  StreamBuilder(
                      stream: _abcBloc.listStream,
                      builder: (context, snapshot) {
                        return TextField(
                          decoration: InputDecoration(
                              labelText: snapshot.data,
                             ....
                        );
                      },
                    ),

AbcBloc.dart

  final _list = BehaviorSubject<List<String>>();
  get listSink => _list.sink;
  get listStream => _list.stream;

编辑

使用建议答案后,它将输出空值。为什么会这样呢?

flutter dart stream
3个回答
1
投票

首先,snapshot.data是String项的列表,因此要将列表显示为单个String,您需要添加toString();。其次,您需要更具体的类型-您需要指定StreamBuilder期望的数据,即

    StreamBuilder<List<String>>(
      stream: _abcBloc.listStream,
      builder: (context, snapshot) {
        return TextField(
            decoration: InputDecoration(
          labelText: snapshot.data.toString(),
        ));
      },
    ),

以您的示例并进行了两项更改之后,[Electrical, Inspection]显示在我设备的文本字段中。


0
投票

我看到的问题:

  • StreamBuilder没有通用类型。设为StreamBuilder<List<String>>
  • 您正在将List传递给labelText参数。您应该传递String。 (例如snapshot.data.toString()
  • 您不会在构建器中检查流中是否有数据。您可以使用snapshot.hasData条件执行此操作,也可以设置initialData参数。

0
投票

我能够修复它。我所做的就是将列表和流放在didChangeDependencies中。

  @override
  void didChangeDependencies() {
     _abcBloc = Provider.of<AbcBloc>(context);      
     list.add('Electrical');
     list.add('Inspection');    
     _abcBloc.listSink.add(list);
     super.didChangeDependencies();

  }
© www.soinside.com 2019 - 2024. All rights reserved.