首页 > 解决方案 > 如何使用 Getx 在已生成的 ListView.builder 中搜索项目

问题描述

目前,我正在显示查询和数据库收到的项目列表。如何使用搜索栏重建 ListView.builder。我只使用 StatelessWidget 因为我正在尝试学习 getX 包。我的 SearchBar 将如何链接到项目列表?

鉴于在搜索栏中我需要加入 onChanged 属性

PS:对不起我的英语,太糟糕了)

我的构建器代码:

Widget build(BuildContext context) {
    return GetX<ProductController>(
      init: ProductController(),
      builder: (controller) {
        return FutureBuilder<List<ProductsCombined>>(
          future: controller.productList.value,
          builder: (context, snapshot) {
            if (snapshot.hasData) {
              return ListView.builder(
                physics: NeverScrollableScrollPhysics(),
                itemCount: snapshot.data.length,
                shrinkWrap: true,
                itemBuilder: (BuildContext context, int index) =>
                    ProductCards(
                  index: index,
                  snapshot: snapshot,
                ),
              );
            } else {
              return Center(child: CircularProgressIndicator());
            }
          },
        );
      },
    );
  }

我的控制器代码:

class ProductController extends GetxController {
  final productList = Future.value(<ProductsCombined>[]).obs;

  @override
  void onInit() {
    fetchProducts();
    super.onInit();
  }

  Future<List<ProductsCombined>> callDb() async {
    return await DBHelper.db.getProducts();
  }

  void fetchProducts() async {
    productList.value = callDb();
  }
}

编辑:我试图这样做,但没有成功

更改了控制器代码:

class ProductController extends GetxController {
  final productList = Future.value(<ProductsCombined>[]).obs;
  Rx<Future <List<ProductsCombined>>> filterProduct = Future.value(<ProductsCombined>[]).obs;//Переписать productList в копию и везде указывать уже копию

  Future<void> searchChanged(String value) async{
    if(value != null && value.isNotEmpty){
       List<ProductsCombined> s = await productList.value;
      filterProduct = Future.value(s.where((element) => (element.productName.toLowerCase().contains(value.toLowerCase()))).toList()).obs;
    }
    filterProduct = productList;
  }


  @override
  void onInit() {
    fetchProducts();
    filterProduct = productList;
    super.onInit();
  }

  Future<List<ProductsCombined>> callDb() async {
    return await DBHelper.db.getProducts();
  }

  void fetchProducts() async {
    productList.value = callDb();
  }
}

在 TextField 中调用方法:

TextField(
        onChanged: (string) {
          controller.searchChanged(string);
        }

同样在 FutureBuilder 中,我更改了 controller.filterProduct.value 上的 controller.ProductList.value

标签: flutterdartflutter-getx

解决方案


推荐阅读