搜索插件、代码仓与 APP 分类

插件详情v0.1.2

flutter_anywhere_menus

任意位置的菜单!现在可以创建浮动菜单,它们会自动根据父控件或触摸/点击位置进行定位。

近 30 天下载
37
喜欢数
36
Pub 分数
40

安装插件

flutter pub add flutter_anywhere_menus

插件介绍

基于插件公开信息、社区数据与项目使用情况整理的选型参考。

Flutter Anywhere Menus 是一个轻量级包,可帮助开发者创建浮动菜单,这些菜单会根据父控件或用户触摸/点击位置动态定位。非常适合上下文敏感操作,通过确保菜单在需要的位置精确显示,从而提升 UI 的交互性,无需手动定位。该包支持响应式设计,并能无缝集成到现有的 Flutter 应用中。在空间有限且直观导航至关重要的移动界面中尤其有用。

适合场景

  • 上下文操作菜单
  • 浮动弹出菜单
  • 基于触摸的菜单位置
  • 响应式 UI 组件
  • 移动应用导航增强

主要特点

  • 基于父级或触摸的自动定位
  • 轻量且易于集成
  • 支持动态布局调整
  • 无需复杂配置
  • 无缝的 Flutter 兼容性

适合对象

  • 移动应用开发者
  • UI/UX 设计师
  • 交互式界面构建工具
  • 频繁上下文操作的应用程序
  • 寻求快速菜单解决方案的开发者

使用建议

  • 仅限 Flutter 平台
  • 无内置动画
  • 需要手动处理菜单项回调
  • 未针对大型菜单项进行优化
  • 依赖于正确的控件层次结构进行定位

原始 README

以下为关联源码仓库的 README 原文快照,最新内容请访问源码仓库。

Flutter Anywhere Menus (FAM) Pub Version

Menus, anywhere you want them!

Default Usage

Imgur

Menu(
  child: MaterialButton(
    child: Text('Show Basic Menu'),
  ),
  menuBar: MenuBar(),
),

Slightly Fancier Menu

Imgur

Menu(
  child: MaterialButton(
    child: Text('Dem Fancy Menus'),
  ),
  menuBar: MenuBar(
    drawArrow: true,
    itemPadding: EdgeInsets.symmetric(horizontal: 15, vertical: 4),
    menuItems: [
      MenuItem(
        child: Icon(Icons.color_lens, color: Colors.grey[600]),
        onTap: () => _incrementCounter(),
      ),
      MenuItem(
        child: Menu(
          offset: Offset(0, 20),
          child: Icon(Icons.colorize, color: Colors.grey[600]),
          menuBar: MenuBar(
              drawArrow: true,
              drawDivider: true,
              maxThickness: 68,
              orientation: MenuOrientation.vertical,
              menuItems: [MenuItem(child: Icon(Icons.add))]),
        ),
      ),
      MenuItem(
          child: Icon(Icons.content_copy, color: Colors.grey[600])),
    ],
  ),
),

Menu On Tap

Imgur

Menu(
  tapType: TapType.tap,
  child: Container(
    width: 300,
    height: 200,
    color: Colors.yellow,
    child: Center(child: Text('Show Menu Over Tap')),
  ),
  menuOverTap: true,
  menuBar: menuBar,
),

Roadmap

  • [x] Vertical menus
  • [ ] Animations
  • [ ] Fixed screen position menus (Guess that'd just be a Toast...)

Background

Why FAM? The short answer is... yak shaving. I needed a menu for a project that would pop up above a widget when I clicked on it. Simple right? Yeah... no. There were a few more requirements that made it a far more interesting problem.

  1. The menu needs to be very customizable
  2. The menu needs the ability to have child menus OR child widgets
  3. The menu (and all children) needs to be a drawn above all other widgets
  4. And this was the doozy... the menu needs to be positionable RELATIVE to its parent widget, and all child menus and child widgets need to be relative positioned to their parent

That last requirement took me down the rabbit hole of Flutter widget positioning and long story short, Flutter is one of a few (maybe the only?) rendering/UI languages I've used that simply cannot do relative positioning out of the box (pun intended). See, the box is what traps you. You can Column() and Row() all day long but you're still trapped in box. What I want is the equivalent of widget1.alignTo(widget2, fromAlignment: Alignment.topCenter, toAlignment: Alignment.bottomCenter) so that I can setup a widget and then just stick it on to another widget. A man can dream right?

Maybe Stack() and Align()? HA! Still stuck in that box, and still no way to define a solid widget-to-widget positioning.

I want my menu outside of the box MAN! And without knowing the sizes of the boxes before rendering, good luck trying to accurately position a menu over (or under, or next to) its intended target widget. So what does FAM do?

It... cheats.

FAM still doesn't know about the properties of the menu before hand, BUT what it can do is render the menu invisibly as an overlay, examine its size, then move it to where it needs to be. The result is that I can now define an absolute relationship between relevant points on a widget (say, tying the bottomCenter of one widget to the topCenter of another) without either widget having any relationship, and without any restrictions on how I draw either widget, while making sure that whatever crazy alignments I do won't mess up the positioning or size of my original widget.

OK. It ain't pretty, but the results do speak for themselves. Hope at least some of you can make use of this, and maybe Flutter will one day have relational positioning like any sensible rendering language.

Credits

This was originally a fork of https://github.com/CaiJingLong/flutter_long_tap_menu that outgrew most of the original code. Many yak were shaved in the process.

所属分类

源码仓库

使用此插件的项目

暂无相关数据。