我正在更新列表的数据源,这是我的应用程序搜索功能的一部分。包含列表的窗口小部件可以知道状态的变化以及列表长度的变化,因此,当搜索过滤出项目时,列表长度会变短。
但是,显示的图块与列表数据源不匹配。
It seems是因为他们不知道状态变化。
我在尝试解决此问题时已读过InheritedWidget
,但似乎不适合列表中的多个索引项?
我希望能够触发其余列表项的重建,以便图块显示更新的数据。我该怎么办?
编辑:这是一些代码
class _ReleaseListViewState extends State<ReleaseListView> {
final List<ReleaseResponse> _releaseResponses;
TextEditingController _searchController;
String _searchText = "";
_ReleaseListViewState(this._releaseResponses, this._model, this._searchController) {
if (_searchController != null)
_searchController.addListener(_searchTextChanged);
}
@override
void initState() {
super.initState();
}
@override
void setState(f) {
if (mounted)
super.setState(f);
}
void _searchTextChanged() {
var text = _searchController.text.toLowerCase();
if (text.isEmpty) {
setState(() {
_searchText = "";
});
} else {
setState(() {
_searchText = text.toLowerCase();
});
}
}
@override
Widget build(BuildContext context) {
List<ReleaseResponse> searchResult = new List();
if (_searchText.isNotEmpty) {
for (var i = 0; i < _releaseResponses.length; i++) {
var response = _releaseResponses[i];
if (response.release.name.toLowerCase().contains(_searchText) ||
response.artists.where((artist) => artist.name.toLowerCase().contains(_searchText)).isNotEmpty) {
searchResult.add(response);
}
}
for (var i = 0; i < searchResult.length; i++) {
log("filteredResponses[" + i.toString() + "] = " + searchResult[i].release.name);
}
} else {
searchResult = _releaseResponses;
}
return new Container(
child: new ListView.builder(
itemCount: searchResult.length,
itemBuilder: (context, i) {
var tile = new ReleaseListTile(
searchResult[i].release,
searchResult[i].artists,
_model,
);
return Container(
child: tile,
);
},
),
);
}
}
并且图块是一个有状态的小部件,但尚无任何特定的状态更新代码。