簡體   English   中英

Flutter Listview 過濾器未在類型上重建列表

[英]Flutter Listview Filter Not Rebuilding List on Type

我正在使用 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);
                
                            },


....



我為完成這項工作所做的是將.where 過濾器添加到提供的列表的末尾。

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM