Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/182.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android Stream builder在第一次加载屏幕时未加载所需数据,然后在更改选项卡后正常工作:颤振_Android_Firebase_Flutter_Tabbar_Stream Builder - Fatal编程技术网

Android 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: 如果我从这个屏幕返回到上一个屏幕,并作出不同的选

我使用流生成器在屏幕上使用flatter填充不同选项卡主体的内容。stream builder从Firebase获取数据,并在不同的列表中传递这些值,这些列表在listView builder中用于显示内容

屏幕上的选项卡应根据上一屏幕上的选择进行更改。这部分很好用。但是,

问题1:

初始加载屏幕时,所有选项卡的内容显示在初始选择的选项卡下。只有当我向右滑动一次,即转到其他选项卡时,我才能在屏幕上获得所需的内容,即相应选项卡下的相应内容

问题2:

如果我从这个屏幕返回到上一个屏幕,并作出不同的选择,再次。。。在这个屏幕上打开的第一个选项卡上,我从点击后退按钮之前加载的上一个选项卡中获取内容。只有当选择不同的选项卡时,我才能获得所需的输出

这意味着编写的代码可以工作,但只能在某些条件下工作。选项卡完全按照预期加载,即使在第一次尝试时,也只有选项卡下的内容是一个问题。。。这也是,只有在加载的第一个屏幕上。这显然意味着流生成器有问题,但我似乎无法准确地找出问题所在

在此方面的任何帮助都将不胜感激

使用stream builder的代码布局为:

 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”返回空值。当第一次加载第二个屏幕,或者返回第一个屏幕并选择另一个选项再次进入该屏幕时,情况就是这样

因此,每当使用不同的选项卡时,它都会在内容中返回所需的值