我试图根据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。
关于如何解决此问题的任何想法?
答案 0 :(得分:1)
我有同样的问题。问题是我的Firestore数据库规则不允许对所涉及的集合进行读写操作。请看看是否能解决您的问题
答案 1 :(得分:-2)
我遇到了同样的问题,总是有connectionState.waiting,因此还有snapshot.data 为空。这意味着无论出于何种原因,都无法获取数据。 然后,我将应用程序运行到调试模式,并收到诸如“无法将请求的类放入单个dex文件中”之类的错误。然后我只是遵循了answer,它为我解决了这个问题。