当前位置:

首页 > 编程开发 > Flutter横向树形选择器实现效果及完整代码

Flutter横向树形选择器实现效果及完整代码

基于Flutter实现横向树形选择器,核心维护面包屑路径与当前选项列表。点击子项时更新路径,点击面包屑可回退。支持递归查找回显路径和搜索叶子节点。提供泛型抽象类,支持安全区适配与两种交互模式,代码仅700余行。

最近项目里需要实现一个多级分类选择器,类似淘宝那种“电子产品 > 手机 > iPhone”的横向展开效果。找了一圈没看到现成的轮子,索性自己动手做一个。

Flutter横向树形选择器实现效果及完整代码

先看效果

大概就是动图里展示的样子:点击一级项会展开下一级,顶部有面包屑导航可以回退,还支持搜索功能。

为什么要横向?

说实话,一开始想用纵向折叠的方案,但产品觉得层级多了以后界面太乱,用户也不清楚自己选到了第几层。后来调研了几款竞品,发现横向展开加面包屑的设计确实清晰很多——用户一眼就能看到当前路径,操作起来心里有数。

核心思路

整个组件的核心是维护两个状态:

  • _breadcrumbs — 面包屑路径,记录用户点击过的父级节点
  • _currentOptions — 当前显示的选项列表

每次点击一个有子项的选项,就把这个选项加入面包屑,同时将它的 children 设为当前选项列表;点击面包屑则反向操作,截取数组即可。

/// 导航到子项
void _na vigateToChildren(T parent) {
  setState(() {
    _breadcrumbs.add(parent);
    _currentOptions = parent.children?.map((child) => child as T).toList() ?? [];
  });
}

/// 导航到面包屑指定位置
void _na vigateToBreadcrumb(int index) {
  setState(() {
    _breadcrumbs = _breadcrumbs.sublist(0, index + 1);
    _currentOptions = _breadcrumbs[index].children?.map((child) => child as T).toList() ?? [];
  });
}

回显这个坑

最麻烦的反而是回显——用户之前选过的值需要重新展示。这就要求在整个树里递归查找,找到目标后把完整路径构建出来:

/// 递归查找项目路径
bool _findItemPath(List options, T target, List path) {
  for (var option in options) {
    path.add(option);

    if (option.value == target.value) {
      return true;
    }

    if (option.children != null && option.children!.isNotEmpty) {
      List children = option.children!.map((child) => child as T).toList();
      if (_findItemPath(children, target, path)) {
        return true;
      }
    }

    path.removeLast();  // 回溯
  }
  return false;
}

这个回溯算法挺经典的:找到了就一路返回 true,没找到就把刚加的节点删掉,继续尝试下一个。

搜索功能

搜索是后来加的,需求很明确:只搜索叶子节点(最终可选的项),然后显示完整路径,让用户知道这个选项在哪个分类下。

void _searchInTree(List options, String query, List results, List path) {
  for (var option in options) {
    final bool isLeaf = option.children == null || option.children!.isEmpty;
    final bool nameMatches = option.name?.toLowerCase().contains(query) == true;
    
    if (isLeaf && nameMatches) {
      results.add(option);
    }

    // 递归搜索子项
    if (option.children != null && option.children!.isNotEmpty) {
      List newPath = List.from(path)..add(option);
      List children = option.children!.map((child) => child as T).toList();
      _searchInTree(children, query, results, newPath);
    }
  }
}

数据结构设计

为了通用性,定义了一个抽象类,业务方继承一下就能用:

abstract class OptionChildrenItem {
  String? name;
  String? value;
  List? children;

  OptionChildrenItem({this.name, this.value, this.children});
}

同时还提供了一个默认实现 OptionChildrenItemImpl,不想自定义的话可以直接用。

使用方式

调用起来很简单,一行代码就能弹出来:

final result = await showHorizontalTreePopup(
  context: context,
  options: _demoOptions,
  title: '请选择分类',
  themeColor: Colors.blue,
  showSearch: true,  // 是否显示搜索框
  showConfirmButton: true,  // 是否显示确定按钮;false 则选中后直接返回
  onConfirm: (selectedItem) {
    print('选中了: ${selectedItem?.name}');
  },
);

一些细节处理

  1. 底部安全区 — iPhone 的小横条要留出来,用 MediaQuery.of(context).padding.bottom 处理。

  2. 泛型支持 — 整个组件是泛型的,T extends OptionChildrenItem,这样业务方自己的数据模型也能直接使用。

  3. 两种交互模式 — showConfirmButton 为 true 时需要点击确定才返回,为 false 时点击叶子节点直接返回,适应不同场景。

总结

整体下来代码量不大,700 多行。核心逻辑就是维护面包屑和当前列表两个状态。最折腾的地方是泛型转换——Dart 的泛型协变有点坑,children 那里需要手动 map 转一下类型。

有需要的可以直接用,pub.dev 搜 horizontal_tree_selector 就行:

dependencies:
  horizontal_tree_selector: ^0.0.1
本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系bd@zhengruan.com
作者最新文章
编程开发 Flutter
相关文章 更多
flutter页面传值到后台的方法及示例代码
flutter页面传值到后台的方法及示例代码

flutter页面传值到后台的完整实现方法及示例代码,帮助读者快速掌握相关技术要点。

flutter状态管理原理是什么及运行机制详解
flutter状态管理原理是什么及运行机制详解

详解Flutter状态管理底层原理,分析Widget、Element与RenderObject三层树结构,解释setState触发重建的因果机制,对比InheritedWidget与主流状态管理库的实现差异,提供性能优化与选型建议。

PHP 与 Flutter 的比较:移动端开发的最佳选择
PHP 与 Flutter 的比较:移动端开发的最佳选择

PHP和Flutter是移动端开发的流行技术。Flutter胜在跨平台能力、性能和用户界面,适合需要高性能、跨平台和自定义UI的应用程序。PHP则适用于性能较低、不跨平台的服务器端应用程序。

Golang学习之基于Flutter的Web应用程序开发
Golang学习之基于Flutter的Web应用程序开发

近年来,移动应用程序开发行业飞速发展,Flutter框架和Golang编程语言的出现为开发人员提供了更多的选择。Flutter是谷歌开发的一款开源UI框架,可以快速构建漂亮且高性能的移动应用程序,而Golang是谷歌开发的高效编程语言,也因其并发性能闻名。本文将介绍如何基于Flutter和Golang来开发Web应用程序。一、Flutter与Golang的简

Flutter组件2:Icons的妙用技巧
Flutter组件2:Icons的妙用技巧

在Flutter开发中,图标是界面设计的重要组成部分。通过使用图标,我们可以为用户提供更直观的视觉体验。本文将详细介绍如何在Flutter中使用Icons组件,并展示不同场景下的图标应用。用户界面产品在设计用户界面时,图标可以帮助用户更快速地理解和操作应用程序。例如,在移动应用中,图标可以用于导航栏、按钮等。以下是几种常见的UI产品图标使用场景:视频播放视频播放界面中,图标用于控制播放、暂停、快进等功能。图标的使用可以让用户直观地操作视频内容。交流对话在聊天或社交应用中,图标可以用于表示消息类型、发送状态

使用PHP结合Flutter构建跨平台美观的移动应用
使用PHP结合Flutter构建跨平台美观的移动应用

在今天的移动应用市场中,跨平台应用的需求越来越多。为了满足这种需求,Google推出了Flutter,一个开源软件开发框架,能够支持快速构建美观的iOS和Android应用程序。与此同时,PHP作为一种流行的Web编程语言,也可以与Flutter一起使用,以便构建可靠的、高效的、美观的跨平台应用程序。在本文中,我将探讨如何在PHP中使用Flutter并构建美

 新广告格式和全屏广告设计:YandexAds 推出 Yandex 移动广告 SDK7
新广告格式和全屏广告设计:YandexAds 推出 Yandex 移动广告 SDK7

Yandex移动广告SDK7为应用开发商提供借由YandexAdvertisingNetwork增加其应用内广告收入的新机会。除此之外,新的信息流广告格式助力应用变现,同时全屏格式也新增设计。2024年4月24日,上海--YandexAdvertisingNetwork是YandexAds面向应用的服务生态系统的一部分,助力应用在iOS和Android操作系统上变现,同时可以在Unity和Flutter平台上使用插件。超过12,000款应用通过展示来自300,000多名直接广告主以及80多个第三方广告来源

使用Python和Flutter构建移动应用程序
使用Python和Flutter构建移动应用程序

近年来,移动应用程序的需求日益增长,许多公司和开发者开始投入大量资源和时间来开发他们自己的应用。Python和Flutter是两种非常流行的编程语言,它们在处理移动应用程序方面非常强大。在本文中,我们将讨论如何使用Python和Flutter来构建移动应用程序。Python是一种高级编程语言,常用于人工智能、数据分析、自然语言处理和网络编程等领域。Pytho

一文带你弄懂Flutter的热部署
一文带你弄懂Flutter的热部署

关于Dart中的运行方式JIT:JustInTime.动态解释,一边翻译一边执行,也称为即时编译,如JavaScript,Python等,在开发周期中使用,可以动态下发和执行代码,开发测试效率高,但是运行速度和性能则会受到影响,Flutter中的热重载正是基于此特性AOT:AheadofTime.静态编译,是指程序在执行前全部被翻译为机器码,提前编译,如C,C++,OC等,发布时期使用AOT,就不需要像RN那样在跨平台JavaScript代码和原生Android、iOS代码间建立低效

Python 可以用来构建 Flutter 应用吗?
Python 可以用来构建 Flutter 应用吗?

作者|ValentineEnedah译者|王德朕Flutter在软件研发领域是非常流行的,今天就让我们深入了解一下,用Python构建Flutter应用程序的世界!关于FLET在开始学习前,了解一下什么是FLET?FLET可以使开发人员通过Python,轻松地构建实时Web、移动和桌面应用程序,更加疯狂的是不需要你有前端经验,也能让你开发出稳定的Web应用程序,虽然移动版本还在开发中。1、FLET令人惊叹的功能1.由Flutter驱动;2.你可以在几分钟内实现一

查看更多
精品专题 更多
装机必备
装机必备

正软商城装机必备专区,精选办公、浏览器、安全防护、影音播放、压缩解压、设计创作和系统工具等电脑常用正版软件,帮助用户快速完成新电脑软件配置。

Windows
Windows

正软商城Windows软件专区,汇集适用于Windows电脑的办公、设计、安全防护、影音播放、开发工具和系统优化软件,提供软件介绍、系统要求、正版授权及购买下载服务。

PDF教程
PDF教程

正软商城PDF教程频道提供PDF编辑、转换、合并、拆分、压缩及格式处理方法,同时介绍常用PDF软件和工具的使用技巧。

Mac软件 更多
Adobe Acrobat Pro macOS版
Adobe Acrobat Pro macOS版
Mac

Adobe Acrobat Pro 是面向办公、法务、财务、教育及出版用户的专业PDF处理软件,可在Mac上创建、编辑、转换、合并和保护文档,并提供OCR文字识别、表单、批注、内容比较、敏感信息遮盖及电子签名功能。

Blender
Blender
Windows、macOS 和 Linux

Blender 是一款免费开源、跨平台的专业 3D 创作软件,集建模、动画、渲染、视频编辑与视觉合成等功能于一体,广泛应用于影视动画、游戏设计和建筑可视化等领域。软件支持 Cycles 物理渲染器与 Eevee 实时渲染引擎,并提供多边形建模、骨骼绑定、物理模拟等专业工具。Blender 兼容 Windows、macOS 和 Linux 系统,安装包轻巧、运行流畅,依托活跃的全球开发者社区持续更新,是从初学者到专业创作者都值得选择的正版 3D 创作工具。

Shapr3D macOS版
Shapr3D macOS版
Mac

Shapr3D是一款面向工业设计、机械工程、建筑概念和三维打印工作流的CAD软件。Mac版采用Parasolid建模内核,支持草图约束、实体建模、工程图、可视化渲染及常见CAD格式交换,并可通过账户在多台设备之间同步项目。

WINDOWS 更多
AutoCAD Windows版
AutoCAD Windows版
Windows

AutoCAD 是 Autodesk 推出的专业计算机辅助设计软件,Windows 版支持精确二维绘图、三维实体与曲面建模、图纸标注、布局发布和任务自动化,并包含多套行业专业化工具组合,适用于建筑、机械、电气、工程建设及制造设计人员。

Adobe Acrobat Pro Windows版
Adobe Acrobat Pro Windows版
Windows

Adobe Acrobat Pro 是面向专业 PDF 工作的综合解决方案,可在 Windows 中创建、编辑、转换、比较、整理和保护文档,并支持表单、电子签名、扫描件文字识别及敏感信息永久遮盖。订阅还包含网页、移动服务和云端协作能力,

Blender
Blender
Windows、macOS 和 Linux

Blender 是一款免费开源、跨平台的专业 3D 创作软件,集建模、动画、渲染、视频编辑与视觉合成等功能于一体,广泛应用于影视动画、游戏设计和建筑可视化等领域。软件支持 Cycles 物理渲染器与 Eevee 实时渲染引擎,并提供多边形建模、骨骼绑定、物理模拟等专业工具。Blender 兼容 Windows、macOS 和 Linux 系统,安装包轻巧、运行流畅,依托活跃的全球开发者社区持续更新,是从初学者到专业创作者都值得选择的正版 3D 创作工具。