如何在自定义 TextField 中设置控制器和焦点节点 - Flutter
How to set controller and focusnode in custom TextField - Flutter
我正在尝试创建带有下拉列表的自定义 TextField 小部件。我想给它控制器和焦点节点的参数。我不希望它们是必需的,但如果它们不是必需的,我就不能为 Controller()
和 FocusNode()
设置它们。我不能让它们具有 null
值,因为我已经在 class 中使用它们了。我不知道该怎么做。这是我拥有的:
import 'package:flutter/material.dart';
import 'package:flutter/widgets.dart';
class DropdownText extends StatefulWidget {
final TextEditingController controller;
final FocusNode focusNode;
const DropdownText({Key key, this.controller, this.focusNode}) : super(key: key);
@override
_DropdownTextState createState() => _DropdownTextState();
}
class _DropdownTextState extends State<DropdownText> {
bool _show = false;
@override
void initState() {
super.initState();
widget.focusNode.addListener(listener);
}
void listener(){
if(widget.focusNode.hasFocus){
setState(() {
_show = true;
});
}else{
setState(() {
_show = false;
});
}
}
}
并且我已经在这个 class 中使用我的 TextField 的文本(使用 controller.text
),当有人触摸其中一个选项来更改上面写的内容时。有什么方法可以让我的小部件用户像 TextField 一样访问 controller
和 focusNode
?
PS:英语不是我的第一语言,我开始使用 flutter 进行 OOP 编程。
您可以在 _DropdownTextState
中使用两个单独的对象并在 initState()
中初始化它们。
签出以下代码。
class _DropdownTextState extends State<DropdownText> {
TextEditingController _controller;
FocusNode _focusNode;
bool _show = false;
@override
void initState() {
super.initState();
if (widget.controller != null)
_controller = widget.controller;
else
_controller = TextEditingController();
if (widget.focusNode != null)
_focusNode = widget.focusNode;
else
_focusNode = FocusNode();
_focusNode.addListener(listener);
}
@override
void dispose() {
super.dispose();
_controller?.dispose();
_focusNode?.dispose();
}
void listener() {
if (widget.focusNode.hasFocus) {
setState(() {
_show = true;
});
} else {
setState(() {
_show = false;
});
}
}
@override
Widget build(BuildContext context) {
return TextField(
focusNode: _focusNode,
controller: _controller,
);
}
}
希望对您有所帮助:)
我正在尝试创建带有下拉列表的自定义 TextField 小部件。我想给它控制器和焦点节点的参数。我不希望它们是必需的,但如果它们不是必需的,我就不能为 Controller()
和 FocusNode()
设置它们。我不能让它们具有 null
值,因为我已经在 class 中使用它们了。我不知道该怎么做。这是我拥有的:
import 'package:flutter/material.dart';
import 'package:flutter/widgets.dart';
class DropdownText extends StatefulWidget {
final TextEditingController controller;
final FocusNode focusNode;
const DropdownText({Key key, this.controller, this.focusNode}) : super(key: key);
@override
_DropdownTextState createState() => _DropdownTextState();
}
class _DropdownTextState extends State<DropdownText> {
bool _show = false;
@override
void initState() {
super.initState();
widget.focusNode.addListener(listener);
}
void listener(){
if(widget.focusNode.hasFocus){
setState(() {
_show = true;
});
}else{
setState(() {
_show = false;
});
}
}
}
并且我已经在这个 class 中使用我的 TextField 的文本(使用 controller.text
),当有人触摸其中一个选项来更改上面写的内容时。有什么方法可以让我的小部件用户像 TextField 一样访问 controller
和 focusNode
?
PS:英语不是我的第一语言,我开始使用 flutter 进行 OOP 编程。
您可以在 _DropdownTextState
中使用两个单独的对象并在 initState()
中初始化它们。
签出以下代码。
class _DropdownTextState extends State<DropdownText> {
TextEditingController _controller;
FocusNode _focusNode;
bool _show = false;
@override
void initState() {
super.initState();
if (widget.controller != null)
_controller = widget.controller;
else
_controller = TextEditingController();
if (widget.focusNode != null)
_focusNode = widget.focusNode;
else
_focusNode = FocusNode();
_focusNode.addListener(listener);
}
@override
void dispose() {
super.dispose();
_controller?.dispose();
_focusNode?.dispose();
}
void listener() {
if (widget.focusNode.hasFocus) {
setState(() {
_show = true;
});
} else {
setState(() {
_show = false;
});
}
}
@override
Widget build(BuildContext context) {
return TextField(
focusNode: _focusNode,
controller: _controller,
);
}
}
希望对您有所帮助:)