Flutter Widget 之FocusableActionDetector使用详解

2022-11-25 15:09:31

目录Material按钮会很好但我们知道它们不一定适合你的应用程序,所以你要自己编写。可悲的是,从头开始编写自己的空间可能是一项艰巨的工作。桌面用户期待悬停高亮、焦点和键盘快捷键,这是很难做好的。是这...

目录

Material按钮会很好

image.png

但我们知道它们不一定适合你的应用程序,所以你要自己编写。可悲的是,从头开始编写自己的空间可能是一项艰巨的工作。

桌面用户期待悬停高亮、焦点和键盘快捷键,这是很难做好的。

是这样的,你在你的应用程序中创建一个自定义的按钮, 使用GestureDetector,当你点击它的时候,按钮会做一些事情

GestureDetector(
    onTap: showDash,
    child: Container(
        child: ColoredBox(
            child: Text("Click me!"),
        ),
    ),
)
复制代码

ezgif.com-gif-maker (1).gif

你添加适当的变量和函数来存储和操作状态,如onHovered和onFocus

bool%20_onHovered%20=%20false; bool%20_onFocus%20=%20false; onHover()%20{ %20%20%20%20_onHovered%20=%20!_onHovered; } onFocus(bool%20focused)%20{ %20%20%20%20_onFocus%20=%20focused; } 复制代码

为按钮添加一些条件性的样式

GestureDetector( %20%20%20%20onTap:%20showDash, %20%20%20%20child:%20Container( %20%20%20%20%20%20%20%20decoration:%20_onFocus%20?%20Red%20Border%20:%20Blue%20Border, %20%20%20%20%20%20%20%20child:%20ColoredBox( %20%20%20%20%20%20%20%20%20%20%20%20color:%20_onHovered%20?%20BlueGrey%20:%20Blue, %20%20%20%20%20%20%20%20%20%20%20%20child:%20Text("Click%20me!"), %20%20%20%20%20%20%20%20) %20%20%20%20) ) 复制代码

给按钮一个鼠标区域,包入一个Focus部件,然后是一个Action部件,最后是一个Shorpythontcuts部件,更不用输欧四个部件中的三个嵌套顺序了

GestureDetector( %20%20%20%20onTap:%20showDash, %20%20%20%20child:%20Shortcuts( %20%20%20%20%20%20%20%20shortcuts:%20{MAP%20OF%20SHORTCUTS}, %20%20%20%20%20%20%20%20child:%20Actions( %20%20%20%20%20%20%20%20%20%20%20%20actions:%20{MAP%20OF%20ACTIONS%20AND%20INTENTS}, %20%20%20%20%20%20%20%20%20%20%20%20child:%20Focuus( %20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20onFocusChange:%20(bool%20focused)%20=>%20onFocus(focused), %20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20child:%20MouseRegion( %20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20onEnter:%20(PointerEnterEvent%20event)%20=>%20onHover(), %20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20onExit:%20(PointerExitEvent%20event)%20=>%20onHover(), %20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20chihld:%20<Button> %20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20), %20%20%20%20%20%20%20%20%20%20%20%20), %20%20%20%20%20%20%20%20), %20%20%20%20), ) 复制代码

所以如果你不小心把Focus放在上面,就会毫无作用,太麻烦了

你的build方法变得很难操作了,它现在至少有四个部件还不包括GestureDetector.

ezgif.com-gif-maker (2).gif

所以你在写这些模版之前,请看看FocusableActionDetector,它将Actions、Shortcuts、Foocus和MouseRegion的所有功能结合在一个小部件中,与其嵌套所有四个部件,不如完全用FocusableActionDetector来代替。

给FocusableActionDetector提供与你传递给前几个小部件相同的信息:Shortcut的Map,action的Map,焦点的回调以及最后悬停变化的回调

GestureDetector( %20%20%20%20onTap:%20showDash, %20%20%20%20child:%20FocusableActionDetector( %20%20%20%20%20%20%20%20onShowHoverHighlight:%20onHover, %20%20%20%20%20%20%20%20onShowFocusHighlight:%20onFocus, %20%20%20%20%20%20%20%20actions:%20{MAP%20OF%20ACTIONS}, %20%20%20%20%20%20%20%20shortcuts:%20{MAP%20OF%20SHORTCUTS}, %20%20%20%20%20%20%20%20child:%20<Button> %20%20%20%20) ) 复制代码

就这样,一个具有悬停效果和键盘快捷键的可聚焦按钮,所有你想要的功能,而不需要确保你以正确的顺序手动潜逃四个不同的小部件

如果想了解有关FocusableActionDetector的内容,或者关于Flutter的其他功能,请访问pub.dev

以上就是Flutter Widget 之FocusableActionDetector使用详解的详细内容,更多关于Flutter Widget FocusableActionDetector的资料请关注我们其它相关文章!