flutter - Flutter:从子 StreamBuilder 更新有状态小部件
问题描述
我已经编写了一些简化的代码,我希望 Firestore 数据的条件能够更新父小部件。
我收到错误:在构建期间调用了 setState() 或 markNeedsBuild()。
如何从 StreamBuilder 中更新 myVar 的状态?更新 myVar 后,不会访问 StreamBuilder,而只会显示文本 Waiting...。
编辑:我更新了 myVar 以用作 Firestore 的文档 ID。为了澄清,我希望能够从 StreamBuilder 内部更新 StreamBuilder 的文档。换句话说,正如问题所说,从子 StreamBuilder 更新有状态小部件。
class MyWidget extends StatefulWidget {
MyWidget({Key key})
: super(key: key);
@override
_MyWidgetState createState() {
return _MyWidgetState();
}
}
class _MyWidgetState extends State<MyWidget> {
String myVar = "someID";
@override
Widget build(BuildContext context) {
if (myVar == null) {
// update myVar async, so that StreamBuilder will be re-rendered
asyncFunctUpdate(myVar); // edit: finally got it to work if doing setState from asyncFuncUpdate(myvar).then(()=>setState)
return Text("Waiting...");
}
else
return StreamBuilder<DocumentSnapshot>(
stream: Firestore.instance
.collection('myCollection')
.document(myVar)
.snapshots(),
builder: (context, orderSnapshot) {
if (!orderSnapshot.data.exists)
setState(() {
myVar = null;
});
else return Text(orderSnapshot);
});
}
}
解决方法:在我的情况下,像通常从 onPressed 函数一样从 StreamBuilder 和 setState 返回按钮更简单。
解决方案:不要从异步函数中执行 setState,而是在 .then 子句中执行(参见上面的代码)
解决方案
一般来说,你不必做你现在正在做的事情。你可以做 return Text ("Waiting ..."); 立即无需调用 setState。在您的情况下,这是一个更好的决定。您响应来自流的事件并且必须根据当前状态返回内容
return StreamBuilder<DocumentSnapshot>(
stream: Firestore.instance
.collection('myCollection')
.document('myDocument')
.snapshots(),
builder: (context, orderSnapshot) {
if (!orderSnapshot.data.exists)
return Text("Waiting...");
else return Text(orderSnapshot);
});
推荐阅读
- android - Android:将不同的内容从视图模型传递到不同的包含标签
- javascript - 获得 200 ok 状态但从邮递员那里给出响应错误
- php - PHP 和 MYSQL 中的错误 1064
- php - angularjs GET 500(内部服务器错误)
- python - 在 Excel 中打开 Python 写入 CSV
- memory - 文件系统中的命名管道不是很慢吗?
- mysql - 如何使用 django 和 phpmyadmin 配置 mysql
- c# - 使用属性路由在 .NET Core 2.0 中接受 API 的多个参数
- php - 连接两个多维数组
- python - Python numpy:linalg.pinv() 太不精确