flutter - (Flutter) StreamBuilder 只返回 null
问题描述
我正在尝试创建一个“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()),
),
);
},
);
因此,当用户选择一个新类别时,我尝试像这样更新 Stream:
CategoryStream().updateCategory(currentChosenCategory);
无论我做什么,结果总是null。尽管 print() 函数中显示了正确的类别......我错过了什么?
也许我需要使用 StreamProvider?不是 StreamBuilder?因为我正在将来自 Parent-Widget 的数据添加到 Child-Widget 的 Child-Widget ..
解决方案
默认情况下,a 的StreamController
值为 null。在调用之前,您需要在流中设置initialData
或添加数据:snapshot.data
StreamBuilder
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
),
);
},
);
推荐阅读
- javascript - 现有集合的猫鼬自动增量
- azure - 我们可以通过在 ARM 模板中传递 vnet id 将 vnet 集成到 azure 容器注册表吗?
- docker - 如何使用在我的 Dockerfile 中保存为 tar 文件的 docker 图像作为父图像
- dataframe - 将 spark df 转换为后续对的 df
- python - 引用如何在 python 中工作以及如何创建链表的单独副本以与原始链表进行比较
- kotlin - Kotlin Fused Location Provider 不止一次获得位置更新
- html - 我的分页当前页码不可见
- python - 将str转换为日期python
- javascript - 具有动态行的内联表使用php添加并发布到sql
- android - 保存搜索历史 Android Kotlin