- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在开发一个应可在Android移动设备和Android TV上使用的应用程序。该应用程序在登录和注册表单中具有关注焦点的字段。这是最小的可复制示例:
import 'package:flutter/material.dart';
void main() => runApp(TestApp());
class TestApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
home: Scaffold(
appBar: AppBar(
title: Text('Test App'),
),
body: SingleChildScrollView(
padding: const EdgeInsets.all(8.0),
child: TestWidget(),
),
),
);
}
}
class TestWidget extends StatelessWidget {
@override
Widget build(BuildContext context) {
return Column(
children: List<Widget>.generate(5, (int index) => TextFormField(
decoration: InputDecoration(
labelText: 'Field ${index + 1}',
),
)),
);
}
}
Tab
键将焦点移到下一个字段,但是按
Shift+Tab
时上一个字段没有获得焦点。同样,箭头键和Android TV远程D-PAD键都不能用于
TextFormField
的焦点遍历,但也可以用于其他可聚焦的小部件。
最佳答案
这是一个长期未决的问题,但是我们开始:
到目前为止,对Android TV的支持还有些不稳定。但是有一些更简单(但不是那么简单)的解决方法可以为我们提供帮助。
基本上从阅读此中篇文章开始:
Adding Android TV support to your Flutter App
首先要做的重要事情是通过将ap包装在Shortcut
小部件中来增加对电视 Remote Dpad的支持:
return Shortcuts(
shortcuts: <LogicalKeySet, Intent>{
LogicalKeySet(LogicalKeyboardKey.select): ActivateIntent(),
},
child: MaterialApp(
...
);
据推测,这会将
select
事件从键盘转发到
activate
意图。 🤷️
TextFormFields
可能仍然不会。
RawKeyboardListener
的方法外,我在这里找不到简单的解决方案。这是(无意间)我有点想的方式。
Shortcut
方法,因此我在pub.dev
focusnode_widgets上查看了此软件包。我检查了一下代码,了解到这样做的人手头有一个非常具体的问题。因此,我剥离了他的示例,并重新实现了他的类
_FocusNodeEnterTapActionableWidget
(他似乎真的很喜欢
looooooooooong 类名...)。
TextFormField
。
_FocusableWidget
替代了
_FocusNodeEnterTapActionableWidget
。
/// get the type from a generic parameter
Type typeOf<T>() => T;
/// if you have large an scrollable pages with large gaps in between of focusable widgets
/// you need something to go to...
/// I used this to navigate through a help/about page
class FocusableAnchor extends StatelessWidget {
@override
Widget build(BuildContext context) => _FocusableWidget(
autoFocus: false,
handleEnterTapAction: (ctx) {},
child: Container(),
focusedBackgroundColor: Colors.transparent,
nonFocusedBackgroundColor: Colors.transparent,
);
}
/// there's another class I will leave out - it's just a wrapper for a given child
/// but I use a custom Android plugin to determine, whether I'm on a TV or not
/// TV: wrap the child widget, No TV: just use the child widget as-is.
/// this is the base wrapper, that is quite large, because it basically has all
/// (some renamed) parameters, needed to create the following widgets:
/// IconButton, FloatingActionButton, MaterialButton, FlatButton, RaisedButton
/// DropdownButton (doesn't really work though, I don't understand why), ListTile
/// CheckboxListTile, RadioListTile (these both are shaky as well)
/// Switch, ActionChip, TextFormField
class FocusableValue<T extends Widget, U> extends StatelessWidget {
FocusableValue({
Key key,
// the key of the widget to create
this.widgetKey,
// IconButton, FloatingActionButton
this.icon, // DropdownButton
this.onPressed,
this.onLongPress,
this.tooltip,
// ... many more
// explicitly set widget
this.widget,
this.colorFocused = true,
}) : super(key: key);
final Key widgetKey;
final Widget icon;
final void Function() onPressed;
final void Function() onLongPress;
final String tooltip;
final T widget;
final bool colorFocused;
// a former colleague decided to use Kiwi for DI...
final _uiMode = inject<UiModePlugin>();
@override
Widget build(BuildContext context) => FutureBuilder(
future: _uiMode.getUiModeType(),
initialData: null,
builder: (ctx, snap) {
if (!snap.hasData || snap.hasError || snap.data == null) {
return Container();
}
var widget = this.widget;
Function(BuildContext) onAction;
Color focusBgColor;
if (widget == null) {
final type = typeOf<T>();
switch (type) {
case IconButton:
widget = IconButton(
key: widgetKey,
icon: icon,
onPressed: onPressed,
tooltip: tooltip,
// ignore: avoid_as
) as T;
onAction = (ctx) => onPressed();
focusBgColor = colorAltDarkTransparent;
break;
// basically create your target here, e.g. TextFormField
// TextFormField doesn't need to set the onAction function, though
}
}
Decoration _decorate(Color color) {
if (color == null) return null;
return BoxDecoration(
color: color,
borderRadius: BorderRadius.circular(3.0),
boxShadow: kElevationToShadow[1],
);
}
EdgeInsetsGeometry _padding(bool apply) {
if (!apply) return null;
return EdgeInsets.only(
top: 5.0,
right: 5.0,
bottom: 5.0,
left: 5.0,
);
}
BoxConstraints _constraints(bool apply) {
if (!apply) return null;
return BoxConstraints.tightFor(height: 37.0);
}
return UIMode.tv == snap.data
? _FocusableWidget(
autoFocus: false,
handleEnterTapAction: onAction ?? (ctx) {},
child: widget,
focusedBackgroundColor: null,
nonFocusedBackgroundColor: null,
focusedBackgroundDecoration:
colorFocused ? _decorate(focusBgColor) : null,
nonFocusedBackgroundDecoration: null,
padding: colorFocused ? _padding(focusBgColor != null) : null,
constraints:
colorFocused ? _constraints(focusBgColor != null) : null,
)
: widget;
},
);
}
/// for the most widgets, except for DropdownButton, RadioListTile I can use this wrapper
class Focusable<T extends Widget> extends FocusableValue<T, dynamic> {
Focusable({
Key key,
Key widgetKey,
Widget icon,
Function() onPressed,
Function() onLongPress,
String tooltip,
// more parameter to create other widgets
T widget,
bool colorFocused = true,
}) : super(
key: key,
widgetKey: widgetKey,
icon: icon,
onPressed: onPressed,
onLongPress: onLongPress,
tooltip: tooltip,
// pass all the other parameters here
widget: widget,
colorFocused: colorFocused,
);
}
这很乏味,但是在我的大多数情况下,它是可行的。我只需要弄清楚
CheckboxListTile
和
RadioListTile
-它们在我的(非常繁琐的)自定义对话框中不起作用。
关于flutter - Shift + Tab和箭头(也为D-PAD)键不适用于TextFormField的焦点遍历,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59876983/
我在看 Tabs UI 的选项。默认行为是它们水平堆叠。有没有办法改变它? 我想堆叠Tabs垂直。它将节省大量的 UI“不动产”,尤其是在移动应用程序 UI 中。 最佳答案 尝试这个: Tabs ta
问题:在 Zsh 中使用 TAB 向后导航,类似于在 Firefox 中 Shift-TAB Shift-TAB 应该执行的操作示例 我在终端中运行以下代码 ls 我明白了 A B C D E F
有很多人想知道如何完成制表符。这不是这些问题之一。问题是如何将 tab 键分配给 tab 补全? alt-tab/esc-tab 很痛苦。在面板禁用模式选项卡完成工作,这让我暂时...但我仍然希望面板
所以我有一个带有 3 个屏幕的 TabNavigator。 import React from 'react'; import {TabNavigator,createBottomTabNavigat
我想触发一个事件,例如当我在文本框中按 Tab 键时显示警报消息。 $("input").blur(function (e) { if (e.which == 9) alert(
我将这段代码设置为创建一个选项卡式菜单,它显示为一个选项卡式菜单,但当我加载网站时,选项卡在单击时不会改变。在“检查元素”中它说 $( "#tabs").tabs();不是函数。我不知道下一步要解决这
表单中有多个输入字段的示例,因为有一些字段在此之前会自动填充,如果我按 Tab 键,那么它应该跳过该自动填充的输入字段并应转到空白输入字段 我尝试过,但是当我开始在空白输入中写入时会发生什么,它也会自
我想写一个小的 chrome 扩展程序,它应该从网页 A(当前网页)获取信息,将选项卡更新到网页 B,然后将代码注入(inject)网页 B。不幸的是,以下代码正在将网页更新到 B 但注入(injec
如果当前事件选项卡中的表单很脏,我试图阻止 mat-tab 的选项卡更改。 但是我找不到拦截选项卡更改事件的方法。 // Tab 0 Content // Tab
我已从 MacOS Mojave 上的默认终端切换到 iterm2 .我有一个关于从当前选项卡打开新选项卡的问题。 确实,我希望与上一个当前选项卡处于同一路径。 为此,我执行了经典程序,即转到 ite
我在我的网站的两页上有此代码,但在一页上该功能不起作用。 Firebug 向我显示“$(...).tabs 不是函数”。我不明白为什么,谁能告诉我什么是错的? 这是有效的: http://www.in
我需要可靠的方法来为 Windows 和 XP 创建 %tab% (包含一个制表符)。 SET TAB=" " 应该适用于 Windows 7(未测试)但不适用于 Win XP(已测试)。 这个 fo
我正在尝试使用 RMarkdown 制作静态网页。我想定义一个 UI,它有第一层选项卡,然后是第一层下面的选项卡。我已经在 RMarkdown: Tabbed and Untabbed heading
我正在尝试使用 RMarkdown 制作静态网页。我想定义一个 UI,它有第一层选项卡,然后是第一层下面的选项卡。我已经在 RMarkdown: Tabbed and Untabbed heading
我在使用 chrome.tabs.create 方法打开多个选项卡时遇到问题。我正在尝试使用 chrome.tabs.create 循环打开大约 9 个选项卡,但打开的选项卡数量仅限于 4 个。看起来
我正在使用 Material ui 的标签,并且能够对标签的指示器进行更改。但是,我正在尝试使用样式将每个选项卡的指示器宽度减小到某个固定宽度。但似乎指标以一些计算值定位在左侧,并且给它一个宽度不会使
我在 OS X 终端中使用 emacs 24.3,并且遇到了一些奇怪的事情。 在 markdown-mode.el 中,tab 键通过 (define-key map (kbd "") 'markdo
在 Chrome 开发者工具上 Uncaught (in promise) Error: There is no clipping info for given tab at E._handleRes
在vim中,我想将:tabnew缩短为:tn,将:tabp缩短为:th,将:tabn缩短为:tl在我的.vimrc中。知道我将如何重新映射这样的命令吗? 最佳答案 使用cabbrev: ca tn t
我读过几个主题,讨论 IE 中的地址栏在使用 TAB 时基本上是第一个获得焦点的主题(MSDN 自己的文档讨论了这一点)。 然而,我也见过一些情况,但情况并不总是如此...... 我有一个母版页,内容
我是一名优秀的程序员,十分优秀!