AsyncSnapshot 状态始终为 connectionState.waiting

Posted

技术标签:

【中文标题】AsyncSnapshot 状态始终为 connectionState.waiting【英文标题】:AsyncSnapshot state is always connectionState.waiting 【发布时间】:2019-08-29 12:16:21 【问题描述】:

我正在尝试根据 TextField(搜索栏)的内容动态更新 ListView。

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

TextField 包含在“SearchBar”小部件中。

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

我目前正在使用两个单独的集团。 ScenariosBloc 从数据库中获取所有场景,FilterScenariosBloc 使 List 呈现一个小部件以显示场景,如果它的标题包含 SearchBar 内 TextView 中的字符串。

我正在使用嵌套的 StreamBuilders 来执行此操作(请参阅下面的代码)。

ScenariosList.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);
                  ,
                );
              );
        );
  


SearchBar.dart

Textfield 的 onChanged 方法包含:

    // function to filter the scenarios depending on the users input.
    void filterSearchResults(String query) 
      _filterScenariosBloc.doFilter(query);
    

FilterScenariosBloc.dart

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 一切正常,但filterSnapshot 的状态始终是connectionState.waiting。 关于如何解决此问题的任何想法?

【问题讨论】:

我曾尝试构建自己的自定义搜索,但结果证明有点头疼,我最终只是按照本教程 medium.com/flutterpub/… 进行操作。请记住将您的项目字符串和查询都转换为小写。这是另一个特定于 BLOC 的medium.com/flutterpub/… 【参考方案1】:

我有同样的问题。问题是我的 Firestore DB 规则不允许读取或写入相关集合。看看能不能解决你的问题

【讨论】:

【参考方案2】:

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

【讨论】:

以上是关于AsyncSnapshot 状态始终为 connectionState.waiting的主要内容,如果未能解决你的问题,请参考以下文章

该项目无法识别 AsyncSnapshot

FlutterFutureBuilder 异步编程 ( FutureBuilder 构造方法 | AsyncSnapshot 异步计算 )

Nginx 限制ip并发数及请求速度

Flutter BLOC 状态更新但始终为空值

产品状态始终为“无效”(使用 Cordova 插件购买)

HealthKit 授权状态始终为 1