flutter - 聚焦焦点小部件下方的第一个可聚焦元素
问题描述
我正在尝试将第一个可聚焦元素集中在小部件下方Focus
。考虑以下人工示例。它包含一个BarWidget
with some TextField
。
用FooWidget
给Focus
定的focusNode
. 一秒钟后,我想关注BarWidget
. 请不要说我不想将 a FocusNode
down传递给BarWidget
.
import 'package:flutter/material.dart';
void main() {
runApp(Foo());
}
class Foo extends StatefulWidget {
@override
State createState() => FooState();
}
class FooState extends State<Foo> {
final focusNode = FocusNode();
void initState() {
super.initState();
Future.delayed(
const Duration(seconds: 1),
focusNode.requestFocus,
);
}
@override
Widget build(BuildContext context) => MaterialApp(
home: Scaffold(
body: Focus(
focusNode: focusNode,
child: BarWidget(),
),
),
);
}
class BarWidget extends StatelessWidget {
@override
Widget build(BuildContext context) => Column(
children: [
Text("Foo"),
TextField(),
Text("Bar"),
],
);
}
解决方案
理论上可以通过使用FocusTraversalPolicy.sortDescendants
. 但是,该方法被声明为@protected
. 见:https ://github.com/flutter/flutter/issues/70534
完整示例:
import 'package:flutter/material.dart';
void main() {
runApp(Foo());
}
class Foo extends StatefulWidget {
@override
State createState() => FooState();
}
class FooState extends State<Foo> {
final focusNode = FocusNode(canRequestFocus: false);
void initState() {
super.initState();
void f() {
final policy = FocusTraversalGroup.of(focusNode.context);
// ignore: invalid_use_of_protected_member
final node = policy.sortDescendants(focusNode.traversalDescendants, null).first;
node.requestFocus();
}
Future.delayed(
const Duration(seconds: 1),
f,
);
}
@override
Widget build(BuildContext context) => MaterialApp(
home: Scaffold(
body: Focus(
focusNode: focusNode,
child: BarWidget(),
),
),
);
}
class BarWidget extends StatelessWidget {
@override
Widget build(BuildContext context) => Column(
children: [
Text("Foo"),
TextField(),
Text("Bar"),
],
);
}
推荐阅读
- makefile - Ubuntu BYACC / BTYACC 语法错误
- angular - 无限滚动不能在 nz-modal 主体上工作我怎样才能让它工作
- c# - 使用文件目录作为参数
- jdbc - solr jdbc 抛出异常,好像那里的实现有问题
- wikipedia - 无法在 ubuntu 18.04 上启动 kiwix
- python - 如何将 shell 脚本打包到 pip 包中
- jquery - 从 Table 中获取特定元素
- angular - 建立服务的正确方法是什么?
- string - 从字符串中提取部分文本
- oracle11g - 如何在 ORACLE SQL 中将 12 小时格式时间转换为 24 小时格式时间,例如 01-FEB-18 01.00.21.645000000 PM 应该是 05-01-0018 13:12:44