为什么根 Focus 中的 KeyEventResult.handled 会阻止 KeyEvent 到达叶(primaryFocus)EditableText?

问题描述 投票:0回答:1

据我了解,关键事件应该从最叶子聚焦的 FocusNode 开始,然后如果叶节点允许通过,则传播到根 FocusNode。因此,此处的 Focus 小部件不应该能够阻止关键事件到达 TextField,但它确实如此!你会发现你无法在其中输入任何内容。 (如果将 KeyEventResponse 更改为 KeyEventResponse.ignored,则 TextField 将再次变得可编辑,因此您会发现这就是导致它的原因)

https://dartpad.dev/?id=7b5b886697310f363c4d6c2c1aedaced

import 'package:flutter/material.dart';

void main() {
  runApp(const MyApp());
}

class MyApp extends StatelessWidget {
  const MyApp({super.key});

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      debugShowCheckedModeBanner: false,
      home: Scaffold(
        body: Center(
          child: Focus(onKeyEvent: (FocusNode f, KeyEvent e){
            return KeyEventResult.handled;
          }, child: TextField()),
        ),
      ),
    );
  }
}

我是否误解了国策树?我什至检查了焦点树的堆栈,以确保叶子处的 EditableText 确实是主要焦点,而且确实如此。

flutter
1个回答
0
投票

来自理解Flutter的键盘焦点系统

焦点按键事件在文本输入事件之前处理,因此当焦点小部件围绕文本字段时处理按键事件可防止该按键输入到文本字段中。

所以你看到的效果是设计使然的。返回

KeyEventResult.ignored
是正确的解决方案,如链接中的示例所示。

© www.soinside.com 2019 - 2024. All rights reserved.