【问题标题】:Flutter Listview Filter Not Rebuilding List on TypeFlutter Listview过滤器不重建类型列表
【发布时间】:2020-07-06 19:12:28
【问题描述】:

我正在使用 StreamProvider 获取列表,它可以在屏幕上很好地呈现列表。

当我在搜索框中键入时,列表不会重新构建,但我可以在我键入时看到列表中的列表项被过滤。为什么列表没有在屏幕上重建?我已经包含了尽可能少的代码。

我之前以这种方式过滤了列表,但是通过使用过滤器方法位于构建上下文之上的未来构建器。但我不知道这是否是问题所在,下面的这个例子适用于其他人,我很困惑。已经花了整整两天时间。

请帮助找出我搜索时列表未重建的原因。我希望我的例子已经足够了,我很乐意提供任何细节。谢谢

  @override
  Widget build(BuildContext context) {
    List<NameListData> nameListData = Provider.of<List<NameListData>>(context);  // <- PROVIDER LIST

    List filteredNames = [];         // <- FULL LIST RENDERING FINE ON SCREEN

    List userNamesList = filteredNames = nameListData; 

    return Scaffold(
      body: SafeArea(
        child: Column(
          children: <Widget>[
            Container(
              child: Row(
                children: <Widget>[
                  Expanded(
                    child: Padding(
                      padding: const EdgeInsets.all(9.0),
                      child: TextField(
                        onChanged: (value) {             // <-- FILTER TEXT FIELD AND METHOD
                          value.toLowerCase();
                          setState(() {
                            filteredNames = userNamesList
                                .where((name) => name.userName
                                    .toLowerCase()
                                    .contains(value.toLowerCase()))
                                .toList();
                  
                          });
                        },
                        decoration: kInputSearchDecoration.copyWith(
                          prefixIcon: Icon(
                            Icons.search,
                            color: Colors.blueGrey,
                          ),
                        ),
                      ),
                    ),
                  )
                ],
              ),
            ),

            
            Expanded(
              child: (filteredNames != null)
                  ? ListView.builder(                         // <--LISTVIEW BUILDER
                      shrinkWrap: true,
                      itemCount: filteredNames.length,
                      itemBuilder: (context, index) {
                        return Padding(
                          padding: const EdgeInsets.only(right: 6.0, left: 6.0),
                          child: GestureDetector(
                            onTap: () {
                              navigateToRoutes(filteredNames[index].userName);
                
                            },


....



【问题讨论】:

标签: flutter flutter-provider


【解决方案1】:

我所做的就是将 .where 过滤器添加到提供的列表的末尾。

List< NameListData > nameListData = Provider.of<List< NameListData >>(context)
    .where((crags) =>
        crags.listName.toLowerCase().contains(_searchText.toLowerCase()))
    .toList();

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-11-07
    • 1970-01-01
    • 1970-01-01
    • 2011-11-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-06-18
    相关资源
    最近更新 更多