Dart 空状态页和导航器问题?
我想在flatter应用程序中实现,当新闻提要为空时 当提要中没有活动时,我想显示“无活动”。当数据库有数据时,我想将其从Dart 空状态页和导航器问题?,dart,flutter,future,flutter-navigation,Dart,Flutter,Future,Flutter Navigation,我想在flatter应用程序中实现,当新闻提要为空时 当提要中没有活动时,我想显示“无活动”。当数据库有数据时,我想将其从StreamBuilder加载到ListView.builder 我尝试通过以下方式实现: child: StreamBuilder( stream: collection.snapshots(), builder: (context, snapshot) { if(snapshot.hasData) { return ListView
StreamBuilder
加载到ListView.builder
我尝试通过以下方式实现:
child: StreamBuilder(
stream: collection.snapshots(),
builder: (context, snapshot) {
if(snapshot.hasData) {
return ListView.builder(
itemBuilder: (context, index) =>
build(context, snapshot.data.documents[index]),
itemCount: snapshot.data.documents.length,
);
} else {
return _emptyStateWidget();
}
我必须在else语句中返回一些内容,因为有时快照将没有数据,所以会抛出错误,使小部件返回null
但这会导致小部件树出现问题。因为如果我以后尝试使用Navigator.push-inbuild
Widget:
Widget build(BuildContext context, DocumentSnapshot document) {
…
FlatButton(
onPressed: () async {
await function(document);
if(validated == true) {
await Navigator.push(context, new MaterialPageRoute(
builder: (BuildContext context) =>
new Screen(documentInfo: documentInfo)));
}
将引发以下错误:
查找停用小部件的祖先是不安全的。此时
小部件元素树的状态不再稳定。安全地
在dispose()方法中引用小部件的祖先,保存引用
通过调用
widget的didChangeDependencies()方法
有没有办法避免这种情况,这样就不会抛出错误
出于某种原因,如果我在等待函数(文档)
之前调用Navigator.push
,则不会抛出错误。但我不能允许这样做,因为它必须在函数中执行数据验证,并且只有在成功时才能导航
谢谢
更新:
经过更多的测试,我认为问题是由StreamBuilder
引起的。每当它获得新事件时,它就会重新生成。因此,当调用Navigator.push时,这会导致问题,并且它会获得新事件,所以请尝试重建
如何解决?是否可以从重建子体停止StreamBuilder?,这是因为您正在尝试导航到其他地方,而小部件树仍在生成中
您应该移动导航。例如,在initState
中,将推送到流侦听器
void initState() {
super.initState();
collection.snapshots.listen((data){
if(validated == true) {
await Navigator.push(context, new MaterialPageRoute(
builder: (BuildContext context) =>
new Screen(documentInfo: documentInfo)));
}
});
}
对于空状态,返回newcontainer()
,这样它就不会给出任何错误。对于onPressed
事件,请尝试将导航放置在itemsbuilder
内部,方法是将documentInfo
保存在var
或任何您想要的内容中。感谢回复!您的意思是将导航。在itemBuilder
中推送?感谢您的回复!但已验证
不是来自数据库。这是对从数据库中获取的数据执行操作的结果我在代码中找不到经过验证的。但是validated
是bool
。我尝试使用流,但没有人认为可以在bool
上使用流?我尝试使用您的方法,但看不到如何将您的流添加到我的StreamBuilder
。如何做?