Flutter 如何在自定义文本字段中设置控制器和焦点节点-颤振
我正在尝试创建带有下拉列表的自定义TextField小部件。我想给它控制器和焦点节点的参数。我不希望它们是必需的,但是如果它们不是必需的,我就不能为Flutter 如何在自定义文本字段中设置控制器和焦点节点-颤振,flutter,controller,dropdown,textfield,Flutter,Controller,Dropdown,Textfield,我正在尝试创建带有下拉列表的自定义TextField小部件。我想给它控制器和焦点节点的参数。我不希望它们是必需的,但是如果它们不是必需的,我就不能为Controller()和FocusNode()设置它们。我不能让它们带有null值,因为我已经在类中使用它们了。我不知道该怎么做。以下是我所拥有的: import 'package:flutter/material.dart'; import 'package:flutter/widgets.dart'; class DropdownText e
Controller()
和FocusNode()设置它们。我不能让它们带有null
值,因为我已经在类中使用它们了。我不知道该怎么做。以下是我所拥有的:
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;
});
}
}
}
导入“包装:颤振/材料.省道”;
导入“package:flatter/widgets.dart”;
类DropdownText扩展StatefulWidget{
最终文本编辑控制器;
最终焦点节点焦点节点;
const DropdownText({Key-Key,this.controller,this.focusNode}):super(Key:Key);
@凌驾
_DropdownTextState createState();
}
类_DropdownTextState扩展状态{
bool_show=假;
@凌驾
void initState(){
super.initState();
widget.focusNode.addListener(listener);
}
void侦听器(){
if(widget.focusNode.hasFocus){
设置状态(){
_show=true;
});
}否则{
设置状态(){
_show=false;
});
}
}
}
我已经在这个类中使用了我的TextField的文本(使用controller.text
),当有人触摸其中一个选项来更改写在上面的内容时。我有没有办法像TextField一样让我的小部件用户访问控制器
和焦点节点
PS:英语不是我的第一语言,我开始用面向对象编程和颤振
编辑:
解决方案之后是github存储库的链接。您可以在\u 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,
);
}
}
class\u DropdownTextState扩展状态{
TextEditingController\u控制器;
FocusNode _FocusNode;
bool_show=假;
@凌驾
void initState(){
super.initState();
如果(widget.controller!=null)
_controller=widget.controller;
其他的
_控制器=文本编辑控制器();
if(widget.focusNode!=null)
_focusNode=widget.focusNode;
其他的
_focusNode=focusNode();
_focusNode.addListener(listener);
}
@凌驾
无效处置(){
super.dispose();
_控制器?.dispose();
_focusNode?.dispose();
}
void侦听器(){
if(widget.focusNode.hasFocus){
设置状态(){
_show=true;
});
}否则{
设置状态(){
_show=false;
});
}
}
@凌驾
小部件构建(构建上下文){
返回文本字段(
focusNode:_focusNode,
控制器:_控制器,
);
}
}
希望有帮助:)