Flutter-列表数据源更新时更新列表磁贴

时间:2019-11-07 16:43:48

标签: flutter

我正在更新列表的数据源,这是我的应用程序搜索功能的一部分。包含列表的窗口小部件可以知道状态的变化以及列表长度的变化,因此,当搜索过滤出项目时,列表长度会变短。

但是,显示的图块与列表数据源不匹配。

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,
          );
        },
      ),
    );
  }
}

并且图块是一个有状态的小部件,但尚无任何特定的状态更新代码。

0 个答案:

没有答案