未来构建器中的颤振过滤器数据列表

时间:2021-06-09 21:56:55

标签: flutter dart

我有一个像这样在 FutureBuilder 中使用的列表

Expanded(
  child: Container(
    height: Height * 0.5,
    child: FutureBuilder(
        future: getCustomerList(),
        builder: (context, snapshot) {
          getTake();
          if (snapshot.hasData) {
            list = snapshot.data;
            return SingleChildScrollView(
              child: Column(
                children: [
                  GestureDetector(
                    onTap:(){
                      print(list);
                      print(list.length);
                      var check = list.where((i) => i['give'] > 1).toList();
                      print('list check');
                      print(check);
                      print(check.length);
                      setState(() {
                        list = check;
                      });

                    },
                    child: Container(
                      width: Width * 0.45,
                      decoration: BoxDecoration(
                        borderRadius: BorderRadius.circular(8),
                        color: Color(0xfffdeced),
                      ),
                      child: Text('filter'),
                    ),
                  ),

                  Container(
                    height: Height * 0.5,
                    child: ListView.builder(
                      shrinkWrap: true,
                      itemCount: list.length,
                      itemBuilder:
                          (BuildContext context,
                          int index) {
                        return list[index]

                        ['customerName']
                            .toString()
                            .contains(searchString)
                            ? GestureDetector(
                          onTap: () {
                            Navigator.push(
                              context,

                              MaterialPageRoute(
                                  builder: (context) =>
                                      CustomerData(
                                          data: list[index])),
                            );
                          },
                          child: Padding(
                            padding:
                            const EdgeInsets
                                .only(
                                left: 13,
                                right: 13),
                            child: Container(
                              decoration:
                              BoxDecoration(
                                border: Border(
                                    top: BorderSide(
                                        color: Colors
                                            .grey,
                                        width:
                                        .5)),
                              ),
                              child: Padding(
                                padding:
                                const EdgeInsets
                                    .all(
                                    13.0),
                                child: Row(
                                  mainAxisAlignment:
                                  MainAxisAlignment
                                      .spaceBetween,
                                  children: [
                                    Row(
                                      children: [
                                        CircleAvatar(
                                          child:
                                          Text(
                                            list[index]['customerName'][0]
                                                .toString(),
                                            style:
                                            TextStyle(fontFamily: 'PoppinsBold'),
                                          ),
                                          backgroundColor:
                                          Color(0xffF7F9F9),
                                        ),
                                        SizedBox(
                                          width:
                                          20,
                                        ),
                                        Text(
                                          list[index]['customerName']
                                              .toString(),
                                          style: TextStyle(
                                              fontFamily:
                                              'PoppinsMedium'),
                                        ),
                                      ],
                                    ),
                                    Text(
                                      '${list[index]['give'] - list[index]['take']}',
                                      style: TextStyle(
                                          fontFamily:
                                          'PoppinsMedium',
                                      color: list[index]['give'] - list[index]['take'] < 0 ? Colors.red : Colors.green),
                                    ),
                                  ],
                                ),
                              ),
                            ),
                          ),
                        )
                            : Container();
                      },
                    ),
                  )
                ],
              ),
            );
          }
          else
            return Center(
              heightFactor: 1,
              widthFactor: 1,
              child: SizedBox(
                height: 70,
                width: 70,
                child: CircularProgressIndicator(
                  strokeWidth: 2.5,
                ),
              ),
            );
        }),
  ),
),

您可以在手势检测器上看到我正在过滤列表,但它的工作位置和工作状态也没有改变。

正如你所看到的,我正在打印 list.length 它的显示 2 之后在哪里我可以看到它的显示长度 1 这意味着它工作得很好。但是怎么可能改变它的状态呢?

1 个答案:

答案 0 :(得分:0)

当您使用 SetState 时,您实际上会再次调用您的 FutureBuilder。所以你首先从 snapshot.data 设置列表并显示它们。然后您的手势检测器过滤您的列表并调用 setState。 setState 再次调用 FutureBuilder 将列表设置为 snapshot.data。如果在 list = snapshot.data 后添加一些打印,例如

list = snapshot.data;
print('suprise');
print(list);

你会看到发生了什么。

解决办法是设置一些过滤器,不是对列表,而是对snapshot.data。因此,您必须添加一些新变量,其中包含有关如何过滤数据的信息,高于 FutureBuilder 并将其设置为 setstate。并使用该变量在 getCustomerList 中构建 snapshot.data