StreamBuilder抖动

时间:2019-11-05 09:59:07

标签: flutter dart stream

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

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;

修改

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

3 个答案:

答案 0 :(得分: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]显示在设备的文本字段中。

答案 1 :(得分:0)

我看到的问题:

  • StreamBuilder没有泛型类型。使其StreamBuilder<List<String>>
  • 您要将List传递给labelText参数。您应该传递String。 (例如snapshot.data.toString()
  • 您无需在构建器中检查流中是否有数据。您可以使用snapshot.hasData条件或设置initialData参数来实现。

答案 2 :(得分:0)

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

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

  }