Flutter:搜索页,搜索bar封装

在这里插入图片描述

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();
  }

  @override
  Widget 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();
  
  @override
  void onReady() {
    super.onReady();
    _initData();
  }

  @override
  void 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,
  });


  @override
  Widget 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');
      }
    });
  }
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/957530.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

网络通信---MCU移植LWIP

使用的MCU型号为STM32F429IGT6&#xff0c;PHY为LAN7820A 目标是通过MCU的ETH给LWIP提供输入输出从而实现基本的Ping应答 OK废话不多说我们直接开始 下载源码 LWIP包源码&#xff1a;lwip源码 -在这里下载 ST官方支持的ETH包&#xff1a;ST-ETH支持包 这里下载 创建工程 …

麒麟操作系统服务架构保姆级教程(十三)tomcat环境安装以及LNMT架构

如果你想拥有你从未拥有过的东西&#xff0c;那么你必须去做你从未做过的事情 之前咱们学习了LNMP架构&#xff0c;但是PHP对于技术来说确实是老掉牙了&#xff0c;PHP的市场占有量越来越少了&#xff0c;我认识一个10年的PHP开发工程师&#xff0c;十年工资从15k到今天的6k&am…

elementUI Table组件实现表头吸顶效果

需求描述 当 table 内容过多的时候&#xff0c;页面上滑滚动&#xff0c;表头的信息也会随着被遮挡&#xff0c;无法将表头信息和表格内容对应起来&#xff0c;需要进行表头吸顶 开始编码&#x1f4aa; 环境&#xff1a;vue2.6、element UI step1&#xff1a; 给el-table__h…

AI 新动态:技术突破与应用拓展

目录 一.大语言模型的持续进化 二.AI 在医疗领域的深度应用 疾病诊断 药物研发 三.AI 与自动驾驶的新进展 四.AI 助力环境保护 应对气候变化 能源管理 后记 在当下科技迅猛发展的时代&#xff0c;人工智能&#xff08;AI&#xff09;无疑是最具影响力的领域之一。AI 技…

题解 CodeForces 131D Subway BFS C++

题目传送门 Problem - 131D - Codeforceshttps://codeforces.com/problemset/problem/131/Dhttps://codeforces.com/problemset/problem/131/D 翻译 地铁方案&#xff0c;对于Berland城市来说是一种经典的表示&#xff0c;由一组n站点和连接这些站点的n通道组成&#xff0c;…

如何查看某用户的Git提交数

说明&#xff1a;有些公司自己搭建的Git仓库&#xff0c;可以在仓库项目上查看各用户的提交量及占比。也可通过下面这两个Git命令&#xff0c;查看当前仓库&#xff0c;当前分支的总提交数&#xff0c;及某用户的提交数&#xff1b; # 当前分支的总提交数 git log --oneline |…

SQL sever数据导入导出实验

1.创建数据库TCP-H &#xff08;1&#xff09;右键“数据库”&#xff0c;点击“新建数据库”即可 &#xff08;2&#xff09;用sql语言创建&#xff0c;此处以创建数据库DB_test为例&#xff0c;代码如下&#xff1a; use master;go--检查在当前服务器系统中的所有数据里面…

Codeforces Round 903 (Div. 3) E. Block Sequence

题解&#xff1a; 想到从后向前DP f[i] 表示从 i ~ n 转化为“美观”所需要的最少的步骤 第一种转移方式&#xff1a;直接删除掉第i个元素&#xff0c;那么就是上一步 f[i 1] 加上 1;第二种转移方式&#xff1a;从第 i a[i] 1 个元素直接转移&#xff0c;不需要增加步数&a…

linux-FTP服务配置与应用

也许你对FTP不陌生&#xff0c;但是你是否了解FTP到底是个什么玩意&#xff1f; FTP 是File Transfer Protocol&#xff08;文件传输协议&#xff09;的英文简称&#xff0c;而中文简称为 “文传协议” 用于Internet上的控制文件的双向传输。同时&#xff0c;它也是一个应用程序…

Alluxio 联手 Solidigm 推出针对 AI 工作负载的高级缓存解决方案

作者&#xff1a;Wayne Gao, Yi Wang, Jie Chen, Sarika Mehta Alluxio 作为全球领先的 AI 缓存解决方案供应商&#xff0c; 提供针对 GPU 驱动 AI 负载的高速缓存。其可扩展架构支持数万个节点&#xff0c;能显著降低存储带宽的消耗。Alluxio 在解决 AI 存储挑战方面的前沿技…

深度学习篇---AnacondaLabelImg

文章目录 前言第一部分&#xff1a;Anaconda是什么&#xff1f;1.简介2.特点&#xff08;1&#xff09;包管理器Conda&#xff08;2&#xff09;环境管理&#xff08;3&#xff09;预装包&#xff08;4&#xff09;跨平台&#xff08;5&#xff09;社区支持 3.安装WindowsLinux…

基于Redis实现短信验证码登录

目录 1 基于Session实现短信验证码登录 2 配置登录拦截器 3 配置完拦截器还需将自定义拦截器添加到SpringMVC的拦截器列表中 才能生效 4 Session集群共享问题 5 基于Redis实现短信验证码登录 6 Hash 结构与 String 结构类型的比较 7 Redis替代Session需要考虑的问题 8 …

Open3D计算点云粗糙度(方法一)【2025最新版】

目录 一、Roughness二、代码实现三、结果展示博客长期更新,本文最近更新时间为:2025年1月18日。 一、Roughness 通过菜单栏的Tools > Other > Roughness找到该功能。 这个工具可以估计点云的“粗糙度”。 选择一个或几个点云,然后启动这个工具。 CloudCompare只会询问…

(二叉树)

我们今天就开始引进一个新的数据结构了&#xff1a;我们所熟知的&#xff1a;二叉树&#xff1b; 但是我们在引进二叉树之前我们先了解一下树&#xff1b; 树 树的概念和结构&#xff1a; 树是⼀种⾮线性的数据结构&#xff0c;它是由 n &#xff08; n>0 &#xff09; …

洛谷P8837

[传智杯 #3 决赛] 商店 - 洛谷 代码区&#xff1a; #include<stdio.h> #include<stdlib.h> int cmp(const void*a,const void *b){return *(int*)b-*(int*)a; } int main(){int n,m;scanf("%d%d",&n,&m);int w[n];int c[m];for(int i0;i<n;…

C语言练习(17)

两个乒乓球队进行比赛&#xff0c;各出3人。甲队为A、B、C 3人&#xff0c;乙队为X、Y、Z 3人&#xff0c;并抽签决定比赛名单。有人向队员打听比赛的名单&#xff0c;A说他不和X比&#xff0c;C说他不和X、Z比&#xff0c;请编程序找出3对选手的对阵名单。 #include <stdi…

excel实用工具

持续更新… 文章目录 1. 快捷键1.1 求和 2. 命令2.1 查找 vloopup 1. 快捷键 1.1 求和 windows: alt mac : command shift T 2. 命令 2.1 查找 vloopup vlookup 四个入参数 要查找的内容 &#xff08;A2 6xx1&#xff09;查找的备选集 &#xff08;C2:C19&#xff09;…

【高阶数据结构】布隆过滤器(BloomFilter)

1. 概念 1.1 背景引入 背景&#xff1a;在计算机软件中&#xff0c;一个常见的需求就是 在一个集合中查找一个元素是否存在 &#xff0c;比如&#xff1a;1. Word 等打字软件需要判断用户键入的单词是否在字典中存在 2. 浏览器等网络爬虫程序需要保存一个列表来记录已经遍历过…

Linux内存管理(Linux内存架构,malloc,slab的实现)

文章目录 前言一、Linux进程空间内存分配二、malloc的实现机理三、物理内存与虚拟内存1.物理内存2.虚拟内存 四、磁盘和物理内存区别五、页页的基本概念&#xff1a;分页管理的核心概念&#xff1a;Linux 中分页的实现&#xff1a;总结&#xff1a; 六、伙伴算法伙伴算法的核心…

2025/1/21 学习Vue的第四天

睡觉。 --------------------------------------------------------------------------------------------------------------------------------- 11.Object.defineProperty 1.在我们之前学习JS的时候&#xff0c;普通得定义一个对象与属性。 <!DOCTYPE html> <h…