(Flutter) StreamBuilder 只返回 null

Posted

技术标签:

【中文标题】(Flutter) StreamBuilder 只返回 null【英文标题】:(Flutter) StreamBuilder returns only null 【发布时间】:2021-04-19 01:37:30 【问题描述】:

我正在尝试创建一个“CategoryStream”来根据用户的选择更新 UI。

这是我的直播:

import 'dart:async';

class CategoryStream 
  StreamController<String> _categoryStreamController =
  StreamController<String>();

closeStream() 
  _categoryStreamController.close();


updateCategory(String category) 
  print("Update category in stream was called");
  print("the new category is: " + category);
  _categoryStreamController.sink.add(category);


Stream<String> get stream => _categoryStreamController.stream;

我的 StreamBuilder 看起来像这样:

 return StreamBuilder<String>(
  stream: CategoryStream().stream,
  builder: (context, snapshot) 
    return Container(
      color: Colors.white,
      child: Center(
        child: Text(snapshot.data.toString()),
      ),
    );
  ,
);

所以当用户选择一个新类别时,我尝试像这样更新流:

  CategoryStream().updateCategory(currentChosenCategory);

无论我做什么,结果总是null。尽管 print() 函数中显示了正确的类别... 我错过了什么?

也许我需要使用 StreamProvider?不是 StreamBuilder?因为我正在将来自 Parent-Widget 的数据添加到 Child-Widget 的 Child-Widget..

【问题讨论】:

return Container( 之前添加print(snapshot) - 您在日志中看到了什么? 只有空值。问题是,我想提供更多代码,但小部件太大,无法在此处发布。我想我可能正在使用错误的流实例?因为我在两个小部件中都创建了 _categoryStream。不是两个实例都“使用相同的流”吗? 你的意思是snapshotnull? - 这是不可能的 是的,你是对的,你不能创建多个 CategoryStream 实例,希望它们都引用同一个流 - 这就是为什么你只有“等待”状态 hmmm,那我会参考一些很好的教程来解释Provider package ;-) 【参考方案1】:

默认情况下,StreamController 的值为 null。在StreamBuilder 中调用snapshot.data 之前,您需要设置initialData 或将数据添加到流中:

 final CategoryStream _categoryStream = CategoryStream();
 return StreamBuilder<String>(
  stream: _categoryStream.stream,
  initialData: "",
  builder: (context, snapshot) 
    return Container(
      color: Colors.white,
      child: Center(
        child: Text(snapshot.data), //toString() is unnecessary, your data is already a string
      ),
    );
  ,
);

【讨论】:

我想通过调用 _categoryStream.updateCategory(currentChosenCategory) 将数据添加到流中? 是的,它会将数据添加到流中,但是您会遇到许多可能导致值为空的小错误。我的回答解决了你的问题吗?如果没有,请发布日志。 我应该提一下,_categoryStream.updateCategory(currentChosenCategory) 在另一个小部件中被调用。这是一个问题吗?它应该连接到同一个流,不是吗?不,它仍然不起作用。但是没有错误。我想我只是没有正确理解流.. 您能否发布您的整个代码,包括您调用 _categoryStream.updateCategory() 的部分?

以上是关于(Flutter) StreamBuilder 只返回 null的主要内容,如果未能解决你的问题,请参考以下文章

FirebaseStorage + Flutter,streamBuilder?

来自一个 StreamBuilder 的 Flutter 快照显示在另一个 StreamBuilder 中

Flutter:Streambuilder - 关闭流

Flutter:StreamBuilder 快照——无数据

Flutter Streambuilder 正在复制项目

无法从 StreamBuilder (Flutter) 查询子集合