Android Stream builder在第一次加载屏幕时未加载所需数据,然后在更改选项卡后正常工作:颤振
我使用流生成器在屏幕上使用flatter填充不同选项卡主体的内容。stream builder从Firebase获取数据,并在不同的列表中传递这些值,这些列表在listView builder中用于显示内容 屏幕上的选项卡应根据上一屏幕上的选择进行更改。这部分很好用。但是, 问题1: 初始加载屏幕时,所有选项卡的内容显示在初始选择的选项卡下。只有当我向右滑动一次,即转到其他选项卡时,我才能在屏幕上获得所需的内容,即相应选项卡下的相应内容 问题2: 如果我从这个屏幕返回到上一个屏幕,并作出不同的选择,再次。。。在这个屏幕上打开的第一个选项卡上,我从点击后退按钮之前加载的上一个选项卡中获取内容。只有当选择不同的选项卡时,我才能获得所需的输出 这意味着编写的代码可以工作,但只能在某些条件下工作。选项卡完全按照预期加载,即使在第一次尝试时,也只有选项卡下的内容是一个问题。。。这也是,只有在加载的第一个屏幕上。这显然意味着流生成器有问题,但我似乎无法准确地找出问题所在 在此方面的任何帮助都将不胜感激 使用stream builder的代码布局为:Android Stream builder在第一次加载屏幕时未加载所需数据,然后在更改选项卡后正常工作:颤振,android,firebase,flutter,tabbar,stream-builder,Android,Firebase,Flutter,Tabbar,Stream Builder,我使用流生成器在屏幕上使用flatter填充不同选项卡主体的内容。stream builder从Firebase获取数据,并在不同的列表中传递这些值,这些列表在listView builder中用于显示内容 屏幕上的选项卡应根据上一屏幕上的选择进行更改。这部分很好用。但是, 问题1: 初始加载屏幕时,所有选项卡的内容显示在初始选择的选项卡下。只有当我向右滑动一次,即转到其他选项卡时,我才能在屏幕上获得所需的内容,即相应选项卡下的相应内容 问题2: 如果我从这个屏幕返回到上一个屏幕,并作出不同的选
body : StreamBuilder(
stream: Firestore.instance
. //Required Reference//
.snapshots(),
builder: (BuildContext context, AsyncSnapshot <QuerySnapshot>snapshot) {
var someData = snapshot.data.documents;
List<dynamic> someDocs = someData;
if (snapshot.hasData == null){
return CircularProgressIndicator(),}
else if (snapshot.data.documents.length > 0){
RequiredList1 = [];
..... More such statements ..........
RequiredList11 = [];
for(int i =0; i < someDocs.length; i++){
RequiredList1.add(someData[i]['field1']);
....... More such calls ................
RequiredList11.add(someData[i][field11']);
}
return WidgetToShowContents
}
}
);
正文:StreamBuilder(
流:Firestore.instance
.//所需参考//
.snapshots(),
生成器:(BuildContext上下文,异步快照){
var someData=snapshot.data.documents;
列出一些文档=一些数据;
if(snapshot.hasData==null){
返回循环ProgressIndicator(),}
如果(snapshot.data.documents.length>0){
RequiredList1=[];
……更多此类声明。。。。。。。。。。
RequiredList11=[];
for(int i=0;i
唯一值得注意的是,所做的引用包括当前所选选项卡的名称。然而,由于该选项卡显示正确,而且所有其他选项卡也都工作正常,我确信,这并不是造成问题的原因
我曾想过使用dispose方法来摆脱流生成器来解决问题2,但我不知道如何用流生成器实现这一点,也不确定这是否可行
请将可能有助于解决此问题的任何知识透露出来。干杯 您是否尝试过将您的
StreamBuilder
翻转到它的头上?我知道这可能无关紧要,但我已经看到了它的作用。如果这有帮助,请告诉我
StreamBuilder(
stream: Firestore.instance
. //Required Reference//
.snapshots(),
builder: (BuildContext context, AsyncSnapshot <QuerySnapshot>snapshot) {
if (snapshot.hasData){
if(snapshot.data.documents.length > 0){
var someData = snapshot.data.documents;
List<dynamic> someDocs = someData;
RequiredList1 = [];
..... More such statements ..........
RequiredList11 = [];
for(int i =0; i < someDocs.length; i++){
RequiredList1.add(someData[i]['field1']);
....... More such calls ................
RequiredList11.add(someData[i]['field11']);
}
}else{
return WidgetToShowContents
}
}else{
CircularProgressIndicator();
}
}
);
StreamBuilder(
流:Firestore.instance
.//所需参考//
.snapshots(),
生成器:(BuildContext上下文,异步快照){
if(snapshot.hasData){
如果(snapshot.data.documents.length>0){
var someData=snapshot.data.documents;
列出一些文档=一些数据;
RequiredList1=[];
……更多此类声明。。。。。。。。。。
RequiredList11=[];
for(int i=0;i
您是否尝试过在它的头上翻转您的StreamBuilder
我知道这可能并不重要,但我看到了它的不同之处请告诉我这是否有帮助
StreamBuilder(
stream: Firestore.instance
. //Required Reference//
.snapshots(),
builder: (BuildContext context, AsyncSnapshot <QuerySnapshot>snapshot) {
if (snapshot.hasData){
if(snapshot.data.documents.length > 0){
var someData = snapshot.data.documents;
List<dynamic> someDocs = someData;
RequiredList1 = [];
..... More such statements ..........
RequiredList11 = [];
for(int i =0; i < someDocs.length; i++){
RequiredList1.add(someData[i]['field1']);
....... More such calls ................
RequiredList11.add(someData[i]['field11']);
}
}else{
return WidgetToShowContents
}
}else{
CircularProgressIndicator();
}
}
);
StreamBuilder(
流:Firestore.instance
.//所需参考//
.snapshots(),
生成器:(BuildContext上下文,异步快照){
if(snapshot.hasData){
如果(snapshot.data.documents.length>0){
var someData=snapshot.data.documents;
列出一些文档=一些数据;
RequiredList1=[];
……更多此类声明。。。。。。。。。。
RequiredList11=[];
for(int i=0;i
好的,经过大量调试后,我找到了在加载第一个选项卡时没有在正文中获得所需内容的原因,但在所有后续选项卡中都没有
唯一值得注意的是,所做的引用包括当前所选选项卡的名称。然而,由于该选项卡显示正确,而且所有其他选项卡也都工作正常,我确信,这并不是造成问题的原因
我所做的是,参考调用取决于当前所选选项卡中的值,即对于不同的选项卡,将提取和显示不同的数据
@override
void initState() {
super.initState();
tabController = TabController(length: subCategoryList.length, vsync: this, initialIndex: 0);
tabController.addListener(_setActiveTabIndex);
}
void _setActiveTabIndex() {
activeTabIndex = tabController.index;
setState(() {
currentTab = subCategoryList[activeTabIndex].toString();
});
}
现在,我正在初始化initState()中的tabController,并使用侦听器来知道哪个选项卡当前处于活动状态。在打印这些值时,我了解到在第一次加载屏幕时,“activeTabIndex”和“currentTab”返回空值。当第一次加载第二个屏幕,或者返回第一个屏幕并选择另一个选项再次进入该屏幕时,情况就是这样
因此,每当使用不同的选项卡时,它都会在内容中返回所需的值