You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用GetX实现Flutter商品搜索控制器的技术求助

基于GetX的Flutter商品搜索控制器实现完善方案

1. 补充响应式状态变量

现有代码缺少搜索结果、加载状态和错误信息的响应式管理,需要在CtrlSeproList中添加GetX响应式变量,让UI自动感知状态变化:

class CtrlSeproList extends GetxController {
  final seC = TextEditingController();
  // 响应式商品列表
  final RxList<MdlListpro> products = <MdlListpro>[].obs;
  // 加载状态标识
  final RxBool isLoading = false.obs;
  // 错误信息存储
  final RxString errorMessage = ''.obs;

  // 后续完善的搜索方法...
}

2. 完善搜索方法的状态控制

修改searchProduct方法,加入加载状态切换和错误捕获逻辑,确保状态同步更新:

Future<void> searchProduct(String query) async {
  // 空搜索词直接清空列表
  if (query.trim().isEmpty) {
    products.clear();
    errorMessage.value = '';
    return;
  }

  isLoading.value = true;
  errorMessage.value = '';

  try {
    final response = await http.get(
      Uri.parse('$be/products?search=$query&$ckCS'),
    );
    if (response.statusCode == 200) {
      products.value = mdlListproFromJson(response.body);
    } else {
      errorMessage.value = '搜索失败:服务器返回异常';
    }
  } catch (e) {
    errorMessage.value = '搜索失败:${e.toString()}';
  } finally {
    isLoading.value = false;
  }
}

3. 添加文本监听与防抖优化

避免用户输入时频繁触发接口请求,在控制器初始化阶段添加文本监听,并通过GetX的debounce实现防抖:

@override
void onInit() {
  super.onInit();
  // 监听搜索文本变化
  seC.addListener(() {
    // 500ms内无输入变化才执行搜索,减少无效请求
    debounce(
      seC.text,
      (query) => searchProduct(query),
      time: const Duration(milliseconds: 500),
    );
  });
}

@override
void onClose() {
  // 释放文本控制器,避免内存泄漏
  seC.dispose();
  super.onClose();
}

4. UI层状态绑定示例

在页面中使用Obx监听控制器状态,实现UI自动更新:

class SearchProductPage extends StatelessWidget {
  final CtrlSeproList controller = Get.put(CtrlSeproList());

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(title: const Text('商品搜索')),
      body: Column(
        children: [
          // 搜索输入框
          TextField(
            controller: controller.seC,
            decoration: const InputDecoration(
              hintText: '输入商品名称搜索',
              prefixIcon: Icon(Icons.search),
              border: OutlineInputBorder(),
            ),
          ),
          // 状态与列表展示区
          Obx(() {
            if (controller.isLoading.value) {
              return const Padding(
                padding: EdgeInsets.all(16.0),
                child: CircularProgressIndicator(),
              );
            }
            if (controller.errorMessage.value.isNotEmpty) {
              return Padding(
                padding: const EdgeInsets.all(16.0),
                child: Text(
                  controller.errorMessage.value,
                  style: const TextStyle(color: Colors.red),
                ),
              );
            }
            // 商品列表渲染
            return Expanded(
              child: ListView.builder(
                itemCount: controller.products.length,
                itemBuilder: (context, index) {
                  final product = controller.products[index];
                  return ListTile(
                    title: Text(product.name),
                    subtitle: Text('¥${product.price}'),
                  );
                },
              ),
            );
          }),
        ],
      ),
    );
  }
}

关键注意点

  • 防抖逻辑:减少短时间内的重复接口请求,降低服务器压力
  • 资源清理:在onClose中释放TextEditingController,避免内存泄漏
  • 空值处理:对空搜索词做特殊处理,提升用户体验
  • 错误反馈:将错误信息直观展示给用户,避免无意义的空白状态

内容的提问来源于stack exchange,提问作者Maria Ulfa

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.25 09:01:33