gpt4 book ai didi

Flutter 如何制作可选择/可聚焦的小部件

转载 作者:行者123 更新时间:2023-12-05 01:57:11 26 4
gpt4 key购买 nike

我正在创建一个安卓电视应用。很长一段时间以来,我一直在努力弄清楚为什么当我点击 Remote 上的向上和向下箭头按钮时,它似乎什么也没做,也没有选择任何列表项。

最终我发现,如果我在列表中使用提升按钮或其他可聚焦的小部件,我可以使用箭头键并且它会正常工作。以前我使用的是包裹在手势检测器中的卡片小部件。

所以我想知道按钮和带有手势检测器的卡片之间的区别是什么阻止箭头键选择项目。我怀疑这是焦点。

这是我使用的,不允许 Remote 上的上下键选择它:

GestureDetector(
child: Card(
color: color,
shape: RoundedRectangleBorder(
borderRadius: BorderRadius.circular(15.0),
),
elevation: 10,
child: SizedBox(
width: (width / numberOfCards) - padding * (numberOfCards - 1),
height: (height / 2) - padding * 2,
child: Center(child: Text(cardTitle, style: Theme.of(context).textTheme.bodyText1?.copyWith(fontSize: 16, fontWeight: FontWeight.bold, color: Colors.white),))),
),
onTap: () => onCardTap(),
),

这是我用它替换的按钮,然后使上下键和选择起作用:

ElevatedButton(
onPressed: () {},
child: Text('Test 1', style: Theme.of(context).textTheme.bodyText1?.copyWith(color: Colors.white, fontSize: 18, fontWeight: FontWeight.normal)),
style: ButtonStyle(
backgroundColor: MaterialStateProperty.all(Colors.grey.withOpacity(0.3)),
minimumSize: MaterialStateProperty.all(Size(60, 60)),
elevation: MaterialStateProperty.all(10),
shape: MaterialStateProperty.all(RoundedRectangleBorder(borderRadius: new BorderRadius.circular(50)),)),
),

如果需要,这就是我用来获取按键的内容:

Shortcuts(
shortcuts: <LogicalKeySet, Intent>{
LogicalKeySet(LogicalKeyboardKey.select): const ActivateIntent(),
},

谢谢

最佳答案

带有手势检测器的卡与 ElevatedButton 之间的区别在于您没有 FocusNode .

如果深入了解 ElevatedButton 的实现细节,您会发现它使用了一个 InkWell。用FocusNode

final Widget result = ConstrainedBox(
constraints: effectiveConstraints,
child: Material(
// ...
child: InkWell(
// ...
focusNode: widget.focusNode,
canRequestFocus: widget.enabled,
onFocusChange: updateMaterialState(MaterialState.focused),
autofocus: widget.autofocus,
// ...
child: IconTheme.merge(
// ....
child: Padding(
padding: padding,
child: // ...
),
),
),
),
),
);

因此,如果您将 GestureDetector 替换为 Inkwell,则键盘导航将起作用。

InkWell(
child: Card(
shape: RoundedRectangleBorder(
borderRadius: BorderRadius.circular(15.0),
),
elevation: 10,
child: const SizedBox(
width: 200,
height: 60,
child: Center(
child: Text(
'Test 1',
),
),
),
),
onTap: () {},
)

(使用键盘和方向键在 Android TV 模拟器 API 30 上测试。)

引用资料

关于Flutter 如何制作可选择/可聚焦的小部件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69408573/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com