Flutter 如何在自定义文本字段中设置控制器和焦点节点-颤振

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

我正在尝试创建带有下拉列表的自定义TextField小部件。我想给它控制器和焦点节点的参数。我不希望它们是必需的,但是如果它们不是必需的,我就不能为
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,
控制器:_控制器,
);
}
}
希望有帮助:)