Flutter AsyncSnapshot状态始终为connectionState.waiting

Flutter AsyncSnapshot状态始终为connectionState.waiting,flutter,stream,bloc,stream-builder,Flutter,Stream,Bloc,Stream Builder,我正在尝试根据文本字段(搜索栏)的内容动态更新ListView ListView位于一个“ScenariosList”小部件中,包含一个“Scenarios”列表,这是一个自定义小部件,包含标题、内容和其他数据位(并不真正相关,但对上下文有用)。它的内容通过“ScenariosBloc”从数据库中获取 文本字段包含在“搜索栏”小部件中 目标是在检测到TextField的更改时,使ListView的内容发生更改 我目前正在使用两个单独的blocs。ScenariosBloc从数据库获取所有场景,F

我正在尝试根据文本字段(搜索栏)的内容动态更新ListView

ListView位于一个“ScenariosList”小部件中,包含一个“Scenarios”列表,这是一个自定义小部件,包含标题、内容和其他数据位(并不真正相关,但对上下文有用)。它的内容通过“ScenariosBloc”从数据库中获取

文本字段包含在“搜索栏”小部件中

目标是在检测到TextField的更改时,使ListView的内容发生更改

我目前正在使用两个单独的blocs。ScenariosBloc从数据库获取所有场景,FilterScenariosBloc使列表呈现一个小部件,以显示场景(如果其标题包含搜索栏中文本视图中的字符串)

我使用嵌套的StreamBuilder来实现这一点(请参见下面的代码)

场景列表.省道

  // build individual scenario cards
  Widget _buildScenarioListItem(Scenario scen, String filter) {
    if (!(filter == null || filter == "")) {
      print("null filter");
      if (!(scen.title.contains(filter))) {
        print("match!");
        return ScenarioCard(scen);
      }
    }
    return Container();
  }

  Widget _buildScenarioList(BuildContext context) {
    return StreamBuilder(
        stream: scenarioBloc.scenarios,
        builder: (BuildContext context,
            AsyncSnapshot<List<Scenario>> scenariosSnapshot) {
          if (!scenariosSnapshot.hasData) {
            return CircularProgressIndicator();
          }
          return StreamBuilder(
              stream: filterScenariosBloc.filterQuery,
              initialData: "",
              builder: (BuildContext context, AsyncSnapshot filterSnapshot) {

                if(!filterSnapshot.hasData) return CircularProgressIndicator();

                print("Scenarios Snapshot: ${scenariosSnapshot.toString()}");
                print("Filter Snapshot: ${filterSnapshot.toString()}");

                return ListView.builder(
                  physics: NeverScrollableScrollPhysics(),
                  padding: EdgeInsets.all(0),
                  shrinkWrap: true,
                  itemCount: scenariosSnapshot.data.length,
                  itemBuilder: (BuildContext context, int index) {
                    Scenario scen = scenariosSnapshot.data[index];
                    return _buildScenarioListItem(scen, filterSnapshot.data);
                  },
                );
              });
        });
  }

}
class FilterScenariosBloc {
  // stream - only need one listener
  final _searchController = StreamController<String>.broadcast();

  // output stream
  get filterQuery => _searchController.stream;

  FilterScenariosBloc() {
    doFilter(" ");
  }

  doFilter(String query) {
    _searchController.sink.add(query);
  }
}
FilterScenariosBloc.dart过滤器

  // build individual scenario cards
  Widget _buildScenarioListItem(Scenario scen, String filter) {
    if (!(filter == null || filter == "")) {
      print("null filter");
      if (!(scen.title.contains(filter))) {
        print("match!");
        return ScenarioCard(scen);
      }
    }
    return Container();
  }

  Widget _buildScenarioList(BuildContext context) {
    return StreamBuilder(
        stream: scenarioBloc.scenarios,
        builder: (BuildContext context,
            AsyncSnapshot<List<Scenario>> scenariosSnapshot) {
          if (!scenariosSnapshot.hasData) {
            return CircularProgressIndicator();
          }
          return StreamBuilder(
              stream: filterScenariosBloc.filterQuery,
              initialData: "",
              builder: (BuildContext context, AsyncSnapshot filterSnapshot) {

                if(!filterSnapshot.hasData) return CircularProgressIndicator();

                print("Scenarios Snapshot: ${scenariosSnapshot.toString()}");
                print("Filter Snapshot: ${filterSnapshot.toString()}");

                return ListView.builder(
                  physics: NeverScrollableScrollPhysics(),
                  padding: EdgeInsets.all(0),
                  shrinkWrap: true,
                  itemCount: scenariosSnapshot.data.length,
                  itemBuilder: (BuildContext context, int index) {
                    Scenario scen = scenariosSnapshot.data[index];
                    return _buildScenarioListItem(scen, filterSnapshot.data);
                  },
                );
              });
        });
  }

}
class FilterScenariosBloc {
  // stream - only need one listener
  final _searchController = StreamController<String>.broadcast();

  // output stream
  get filterQuery => _searchController.stream;

  FilterScenariosBloc() {
    doFilter(" ");
  }

  doFilter(String query) {
    _searchController.sink.add(query);
  }
}
class FilterScenariosBloc{
//流-只需要一个侦听器
final _searchController=StreamController.broadcast();
//输出流
get filterQuery=>\u searchController.stream;
FilterScenariosBloc(){
doFilter(“”);
}
doFilter(字符串查询){
_searchController.sink.add(查询);
}
}
用户输入会发送到FilterScenariosBloc,但
filterSnapshot
的状态始终为connectionState.waiting。
有没有办法解决这个问题?

我也遇到了同样的问题,总是有connectionState.waiting,因此还有snapshot.data 是空的。这意味着无论出于何种原因,都无法获取数据。
然后,我将应用程序运行到调试模式,并得到一个错误,如“无法将请求的类装入单个dex文件”。然后我就这么做了,它为我解决了这个问题。

我也有同样的问题。问题是我的firestore DB规则不允许对所讨论的集合进行读取或写入。请看这是否解决了您的问题

我曾尝试构建自己的自定义搜索,但结果有点令人头痛,我只是按照本教程进行了学习。请记住将项目字符串和查询都转换为小写。这是另一个特定于集团的问题