Flutter:搜索页,搜索bar封装

devtools/2025/1/24 17:21:02/

在这里插入图片描述

view
使用内置的Chip简化布局

import 'package:chenyanzhenxuan/common/index.dart';
import 'package:ducafe_ui_core/ducafe_ui_core.dart';
import 'package:flutter/material.dart';
import 'package:get/get.dart';
import 'package:tdesign_flutter/tdesign_flutter.dart';import 'index.dart';class SearchGoodsPage extends GetView<SearchGoodsController> {const SearchGoodsPage({super.key});// 搜索Widget _buildSearch() {return <Widget>[SearchWidget(type: 'input',inputBgColor: AppTheme.pageBgColor,controller: controller.searchController,onChange: (value) {controller.onSearchChange(value);},),].toRow().paddingAll(30.w).card(shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(0)));}// 热门搜索Widget _buildHotSearch() { return <Widget>[<Widget>[TDImage(assetUrl: 'assets/img/hot.png',width: 34.w,height: 34.w,),SizedBox(width: 10.w,),TextWidget.body('热门搜索',size: 28.sp,),].toRow().paddingHorizontal(30.w),<Widget>[for(var i = 0; i < 6; i++)Chip(label: TextWidget.body('热门搜索$i',size: 24.sp,color: AppTheme.color999,),backgroundColor: AppTheme.blockBgColor,shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(10.w)),)].toWrap(spacing: 20.w,runSpacing: 0,).paddingLeft(30.w),].toColumn(crossAxisAlignment: CrossAxisAlignment.start);}// 历史记录Widget _buildHistory() {return <Widget>[<Widget>[TextWidget.body('历史记录',size: 28.sp,),TDImage(assetUrl: 'assets/img/hot-del.png',width: 28.w,height: 32.w,),].toRow(mainAxisAlignment: MainAxisAlignment.spaceBetween).paddingHorizontal(30.w),<Widget>[Chip(label: TextWidget.body('精品专精品专区区',size: 24.sp,color: AppTheme.color999,),backgroundColor: AppTheme.blockBgColor,shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(10.w)),deleteIconColor: AppTheme.color999,onDeleted: () {print('删除');},),for(var i = 0; i < 6; i++)Chip(label: TextWidget.body('精品专区',size: 24.sp,color: AppTheme.color999,),backgroundColor: AppTheme.blockBgColor,shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(10.w)),deleteIconColor: AppTheme.color999,onDeleted: () {print('删除');},)].toWrap(spacing: 20.w,runSpacing: 0,).paddingLeft(30.w),].toColumn(crossAxisAlignment: CrossAxisAlignment.start);}// 主视图Widget _buildView() {return <Widget>[_buildSearch(),SizedBox(height: 30.w,),_buildHotSearch(),SizedBox(height: 30.w,),_buildHistory(),const EmptyState()].toColumn();}@overrideWidget build(BuildContext context) {return GetBuilder<SearchGoodsController>(init: SearchGoodsController(),id: "search_goods",builder: (_) {return Scaffold(backgroundColor: AppTheme.pageBgColor, // 自定义颜色appBar: const TDNavBar(height: 44,title: "搜索",titleFontWeight: FontWeight.w600,backgroundColor: Colors.white,screenAdaptation: true,useDefaultBack: true,),body: SingleChildScrollView(child: _buildView(),),);},);}
}

controller

import 'package:get/get.dart';
import 'package:flutter/material.dart';
class SearchGoodsController extends GetxController {SearchGoodsController();// 搜索框final searchController = TextEditingController();@overridevoid onReady() {super.onReady();_initData();}@overridevoid onClose() {super.onClose();searchController.dispose();}// 初始化数据_initData() {update(["search_goods"]);}// 搜索框发送改变void onSearchChange(String value) {print('搜索内容: $value');searchController.text = value;update(["search_goods"]);}
}

SearchWidget

import 'package:ducafe_ui_core/ducafe_ui_core.dart';
import 'package:flutter/material.dart';
import 'package:get/get.dart';
import 'package:tdesign_flutter/tdesign_flutter.dart';
import 'package:chenyanzhenxuan/common/index.dart';class SearchWidget extends StatelessWidget {// 类型final String type;// 搜索框控制器final TextEditingController? controller;// 输入框背景色final Color? inputBgColor;// 搜索框发送改变final Function(String value)? onChange;const SearchWidget({super.key,required this.type,this.controller,this.inputBgColor,this.onChange,});@overrideWidget build(BuildContext context) {return <Widget>[<Widget>[TDImage(assetUrl: type == 'text' ? 'assets/img/search.png' : 'assets/img/search.png',width: 32.w,height: 32.w,),SizedBox(width: 20.w),type == 'text' ? TextWidget.body('搜索您要找的商品名称', size: 28.sp, color: AppTheme.color999) : InputWidget(placeholder: "搜索您要找的商品名称",controller: controller,).width(450.w),].toRow(),<Widget>[TextWidget.body('搜索', size: 26.sp, color: AppTheme.colorfff),].toRow(mainAxisAlignment: MainAxisAlignment.center).card(color: AppTheme.error,shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(30.w))).tight(width: 120.w,height: 60.w).onTap(() {if(type == 'input' && controller?.text != null){onChange!(controller!.text);}}),].toRow(mainAxisAlignment: MainAxisAlignment.spaceBetween).paddingOnly(left: 30.w,right: 4.w).card(color: inputBgColor,shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(30.w))).tight(width: 690.w, height: 68.w).onTap(() {if(type == 'text'){Get.toNamed('/search_goods_page');}});}
}

http://www.ppmy.cn/devtools/153191.html

相关文章

qml Dialog详解

1、概述 Dialog是QML&#xff08;Qt Modeling Language&#xff09;中用于显示对话框的组件&#xff0c;它提供了一个模态窗口&#xff0c;通常用于与用户进行重要交互&#xff0c;如确认操作、输入信息或显示警告等。Dialog组件具有灵活的布局和样式选项&#xff0c;可以轻松…

docker使用笔记

安装 sudo apt update #更新apt的软件列表 sudo apt-get install ca-certificates curl gnupg lsb-release software-properties-common #安装 安装docker时需要的工具,如果没有这些工具&#xff0c;下面的一些命令会执行失败 curl -fsSL https://download.docker.com/linux/…

webrtc入门系列(五)amazon-kinesis-video-streams-webrtc-sdk-c编译

《webrtc入门系列&#xff08;一&#xff09;easy_webrtc_server 入门环境搭建》 《webrtc入门系列&#xff08;二&#xff09;easy_webrtc_server 入门example测试》 《webrtc入门系列&#xff08;三&#xff09;云服务器coturn环境搭建》 《webrtc入门系列&#xff08;四&…

【MySQL】存储引擎有哪些?区别是什么?

频率难度60%⭐⭐⭐⭐ 这个问题其实难度并不是很大&#xff0c;只是涉及到的相关知识比较繁杂&#xff0c;比如事务、锁机制等等&#xff0c;都和存储引擎有关系。有时还会根据场景选择不同的存储引擎。 下面笔者将会根据几个部分尽可能地讲清楚 MySQL 中的存储引擎&#xff0…

一个基于Python+Appium的手机自动化项目~~

本项目通过PythonAppium实现了抖音手机店铺的自动化询价&#xff0c;可以直接输出excel&#xff0c;并带有详细的LOG输出。 1.excel输出效果: 2. LOG效果: 具体文件内容见GitCode&#xff1a; 项目首页 - douyingoods:一个基于Pythonappium的手机自动化项目&#xff0c;实现了…

JavaScript系列(41)--状态管理实现详解

JavaScript状态管理实现详解 &#x1f504; 今天&#xff0c;让我们深入探讨JavaScript的状态管理实现。状态管理是现代前端应用中的核心概念&#xff0c;它帮助我们有效地管理和同步应用数据。 状态管理基础概念 &#x1f31f; &#x1f4a1; 小知识&#xff1a;状态管理是一…

autogen 中的 Teams 示例

目录 1 .Creating a Team2. Running a Team3. Observing a Team4. Resetting a Team5. Stopping a Team6. Resuming a Team7. Aborting a Team8. 额外的例子 1 .Creating a Team import asynciofrom autogen_agentchat.agents import AssistantAgent from autogen_agentchat.b…

kconfig语法里,怎么实现二选一配置?

在Kconfig语法中&#xff0c;可以使用choice和endchoice关键字来实现二选一配置。以下是一个示例&#xff0c;展示了如何在Kconfig文件中实现二选一配置&#xff1a; config EXAMPLEbool "Example configuration"default y if EXAMPLE choiceprompt "Select on…