您可以在FocusScope 中使用FocusNode 或Focus 来实现类似的效果。 TextField 本身使用FocusNode 来确定它是否有焦点,然后在焦点状态改变时动画颜色变化。这是一个使用Focus 和Builder 仅重建改变焦点的TextFields 的示例实现:
https://dartpad.dev/8488f470b166e4235b64d3ba568b6ba6?null_safety=true
import 'package:flutter/material.dart';
void main() => runApp(const MyApp());
/// This is the main application widget.
class MyApp extends StatelessWidget {
const MyApp({Key? key}) : super(key: key);
static const String _title = 'Flutter Code Sample';
@override
Widget build(BuildContext context) {
return MaterialApp(
title: _title,
home: Scaffold(
appBar: AppBar(title: const Text(_title)),
body: const MyStatelessWidget(),
),
);
}
}
/// This is the private State class that goes with MyStatefulWidget.
class MyStatelessWidget extends StatelessWidget {
const MyStatelessWidget();
@override
Widget build(BuildContext context) {
return FocusScope(
debugLabel: 'Scope',
autofocus: true,
child: Form(
child: Column(
children: [
Focus(
debugLabel: 'TextField1',
child: Builder(
builder: (BuildContext context) {
final FocusNode focusNode = Focus.of(context);
final bool hasFocus = focusNode.hasFocus;
return TextField(
decoration: InputDecoration(
fillColor: hasFocus ? Colors.green : Colors.white,
filled: true
)
);
},
),
),
Focus(
debugLabel: 'TextField2',
child: Builder(
builder: (BuildContext context) {
final FocusNode focusNode = Focus.of(context);
final bool hasFocus = focusNode.hasFocus;
return TextField(
decoration: InputDecoration(
fillColor: hasFocus ? Colors.green : Colors.white,
filled: true
)
);
}
)
)
],
),
),
);
}
}
您当然也可以直接使用FocusNode。为此,您可能必须将TextFields 包装到StatefulWidget 中,然后将侦听器添加到使用的FocusNode,以便在焦点更改时触发重建(使用setState)。但请注意,您需要管理此FocusNode 的生命周期。引用文档:
管理 FocusNode 意味着管理它的生命周期,监听焦点的变化,并在需要时重新设置它的父节点,以保持焦点层次结构与小部件层次结构同步。这个小部件为您完成所有这些事情。如果您不使用 Focus 小部件并且需要自己进行操作,请参阅 FocusNode 了解有关节点管理的详细信息。
https://api.flutter.dev/flutter/widgets/Focus-class.html